[VB] Asynchroon: Access Violation

Pagina: 1
Acties:

  • baskabas
  • Registratie: December 2000
  • Laatst online: 05-04 12:26
Ik heb een VB6 appje gemaakt die een stel services met 2-8 connecties tegelijk aanspreekt om batchverwerkingen wat meer performance te geven. :)

Vanuit mijn VB6 dev-env werkt alles perfect, maar zodra ik hem gecompileerd heb krijg ik een Access Violation... :(

De connecties worden dmv een het timer-truukje asynchroon aangesproken, maar ik vermoed dat VB6 het niet zo leuk vindt dat 1 procedure 2-8 keer naast elkaar draait... daarom had ik hem al in een klasse gekeild, maar zonder resultaat... |:(

Om het in een apparte DLL te gooien kost me weer behoorlijk wat tijd, dus ik was benieuwd of iemand hier al wat ervaring had met dit soort dingen, voordat ik mijn applicatie omgooi en nog geen steek op ben geschoten... Alvast bedankt! ;)

  • baskabas
  • Registratie: December 2000
  • Laatst online: 05-04 12:26
Wat ik me nu ff afvraag is:

Wanneer kun je een Access Violation krijgen?
- Als je 1 procedure meerdere keren naast elkaar hebt lopen?
- Als je 1 centraal object waar alle gegevens weer in moeten komen tegelijk aanroept?

Dat zijn iig dingen die ik me kan bedenken... dat de 2-8 connectie's samen op 1 plek in het geheugen zitten te vroeten... maarja... dat doet VB zelf, dus hoe los ik het op?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23-08 10:39

Janoz

Moderator Devschuur®

!litemod

Waarschijnlijk is het meer het 2e.

Daarnaast is dit natuurlijk een rfedelijk logisch gevolg van het toepassen van allerlij 'truukjes'. Als iets niet in de taal zit kun je dat mischien wel omzeilen door die truukjes, maar je bent niet verzekerd van het feit of het wel degelijk werkt. Probleem is waarschijnlijk dat er geen enkele vorm van synchronisatie meer is.

Is het mischien niet een ID om het programmatje dan maar in een taal te schrijven die wel multithreading ondersteund?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • baskabas
  • Registratie: December 2000
  • Laatst online: 05-04 12:26
Omschrijven naar een andere taal kost me teveel tijd... bovendien zou ik het dan in C# of VB.Net moeten doen (een andere geschikte taal kan ik nog niet), maar daar heb ik nog maar weinig ervaring mee...

Ik heb de Acces Violation inmiddels getackeld... zat in een procedure om de handel op te schonen die al afvuurde voordat er iets aangemaakt was... nu heb ik weer een ander probleempje... hij draait de 2-8 niet Asynchroon, ondanks dat ik 2-8 timertjes op Enabled heb staan gaat ie ze toch 1-voor-1 afwerken?!? :?

  • Mart!
  • Registratie: Februari 2000
  • Laatst online: 23-08 14:17
VB is niet multithreaded, dat wil dus zeggen dat hij NOOIT meerdere procedures tegelijk kan afhandelen, al lijkt dat wel zo. Je zult dus echt naar VB.net of C# of C++ moeten gaan om threads te kunnen gebruiken en zo dus meerdere zaken tegelijk af te handelen. De vraag is echter of je er snelheidswinbst uit haalt, dit is meer afhankelijk van welke functie (functionaliteit) je parallel wilt uitvoeren.

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Mart! schreef op 15 november 2002 @ 10:50:
VB is niet multithreaded, dat wil dus zeggen dat hij NOOIT meerdere procedures tegelijk kan afhandelen, al lijkt dat wel zo. Je zult dus echt naar VB.net of C# of C++ moeten gaan om threads te kunnen gebruiken en zo dus meerdere zaken tegelijk af te handelen. De vraag is echter of je er snelheidswinbst uit haalt, dit is meer afhankelijk van welke functie (functionaliteit) je parallel wilt uitvoeren.
bullshit.. je kunt api calls voor het opstarten van verschillende processes geven... dus geeft wel de mogelijkheid om multithreading te doen...

  • baskabas
  • Registratie: December 2000
  • Laatst online: 05-04 12:26
Mart:
Snelheidswinst is zeker te behalen! Dit heb ik al getest door 4 programmatjes naast elkaar te draaien.... de service calls worden tussen de 200-400ms (per call) afgehandeld en met 4 proggies heb ik 4 keer zoveel calls in 300-500ms... daarom ben ik er ook aan begonnen.

Henk:
Precies! Ik denk ook dat er iets in VB is ingebouwd dat ervoor zorgt dat die timers niet tegelijk afvuren, want als de eerste klaar is, dan klapt hij eruit omdat de overige timers tegelijk aan de slag willen... met 2 connecties gaat het dus goed, maar niet asynchroon.

Ik ben nu aan de slag gegaan met de API Timer (SetTimer en KillTimer API). Wellicht dat die wel tegelijk af willen vuren... de vraag is dan wat VB doet als er 4 timers naar dezelfde handle van de functie terugkomen, maargoed... dat zien we dan wel weer.

[ Voor 0% gewijzigd door baskabas op 15-11-2002 11:11 . Reden: typo's ed ]


  • Mart!
  • Registratie: Februari 2000
  • Laatst online: 23-08 14:17
henkleerssen schreef op 15 november 2002 @ 10:53:
bullshit.. je kunt api calls voor het opstarten van verschillende processes geven... dus geeft wel de mogelijkheid om multithreading te doen...
En dat is ook stierenpoep. Een thread is dus absoluut wat anders dan een proces. Dus een proces opstarten met een api-call vanuit VB, ja dat kan, maar da's dus echt wel wat anders als multi-threading.
offtopic:
Ik wordt trouwens niet graag op bovenstaande manier aangesproken. Ik probeer iemand te helpen en als ik het niet bij het juiste eind heb kun je dat ook op een nette manier kwijt, toch? Of is hier weer sprake van het beruchte baas-boven-baas verhaal?!?

toevoeging n.a.v. D2k: Het is niet TE, maar je komt dit soort dingen zo vaak tegen, vond dat ik er wel even wat OT geblaat aan mocht wijten...

toevoeging: henkleerssen is best lief :Y)

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

[b][message=15977178,noline]Mart! schreef op 15 November
offtopic:
Ik wordt trouwens niet graag op bovenstaande manier aangesproken. Ik probeer iemand te helpen en als ik het niet bij het juiste eind heb kun je dat ook op een nette manier kwijt, toch? Of is hier weer sprake van het beruchte baas-boven-baas verhaal?!?

ach het valt nog wel mee vinnik

hij komt nog met argumenten ;)
je moet het niet te persoonlijk nemen en als je het te ver vind gaan Schop een Modje of D2k@tweakers.net :)
[/offtopic]

Doet iets met Cloud (MS/IBM)


  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Je kunt het een en ander met API call voor timer.. idd precies dingen timen... maar hier is een voorbeeld van een api call voor (van www.allapi.net ) het creeeren van een process (dus niet met dat domme shell commando)...
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
'This program needs a common dialog box, named CDBox
'  (To add the Common Dialog Box to your tools menu, go to Project->Components (or press CTRL-T)
'   and select Microsoft Common Dialog control)
Const INFINITE = &HFFFF
Const STARTF_USESHOWWINDOW = &H1
Private Enum enSW
    SW_HIDE = 0
    SW_NORMAL = 1
    SW_MAXIMIZE = 3
    SW_MINIMIZE = 6
End Enum
Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type
Private Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Byte
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type
Private Enum enPriority_Class
    NORMAL_PRIORITY_CLASS = &H20
    IDLE_PRIORITY_CLASS = &H40
    HIGH_PRIORITY_CLASS = &H80
End Enum
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Function SuperShell(ByVal App As String, ByVal WorkDir As String, dwMilliseconds As Long, ByVal start_size As enSW, ByVal Priority_Class As enPriority_Class) As Boolean
    Dim pclass As Long
    Dim sinfo As STARTUPINFO
    Dim pinfo As PROCESS_INFORMATION
    'Not used, but needed
    Dim sec1 As SECURITY_ATTRIBUTES
    Dim sec2 As SECURITY_ATTRIBUTES
    'Set the structure size
    sec1.nLength = Len(sec1)
    sec2.nLength = Len(sec2)
    sinfo.cb = Len(sinfo)
    'Set the flags
    sinfo.dwFlags = STARTF_USESHOWWINDOW
    'Set the window's startup position
    sinfo.wShowWindow = start_size
    'Set the priority class
    pclass = Priority_Class
    'Start the program
    If CreateProcess(vbNullString, App, sec1, sec2, False, pclass, _
    0&, WorkDir, sinfo, pinfo) Then
        'Wait
        'WaitForSingleObject pinfo.hProcess, dwMilliseconds
        SuperShell = True
    Else
        SuperShell = False
    End If
End Function
Private Sub Form_Load()
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'Set the dialog's title
    CDBox.DialogTitle = "Choose an EXEC-File ..."
    'Error when canceled
    CDBox.CancelError = True
    'Set the dialog's filter
    CDBox.Filter = "EXEC-Files (*.exe)|*.exe|All files (*.*)|*.*"
    'Show the 'Open File'-dialog
    CDBox.ShowOpen
    'Execute the program
    SuperShell CDBox.filename, Left$(CDBox.filename, Len(CDBox.filename) - Len(CDBox.FileTitle)), 0, SW_NORMAL, HIGH_PRIORITY_CLASS
    End
End Sub

Let wel .. ik heb hier de api call 'WaitForSingleObject pinfo.hProcess, dwMilliseconds gecomment.. ..je kunt dat aanpassen zodat je met supershell tegelijk twee dingen aanroept .. (nou ja.. tegelijk.. 1 tickcount ongeveer 1 ms delay ook goed?)

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Mart! schreef op 15 November 2002 @ 11:24:
[...]
En dat is ook stierenpoep. Een thread is dus absoluut wat anders dan een proces. Dus een proces opstarten met een api-call vanuit VB, ja dat kan, maar da's dus echt wel wat anders als multi-threading.
offtopic:
Ik wordt trouwens niet graag op bovenstaande manier aangesproken. Ik probeer iemand te helpen en als ik het niet bij het juiste eind heb kun je dat ook op een nette manier kwijt, toch? Of is hier weer sprake van het beruchte baas-boven-baas verhaal?!?

toevoeging n.a.v. D2k: Het is niet TE, maar je komt dit soort dingen zo vaak tegen, vond dat ik er wel even wat OT geblaat aan mocht wijten...
voor het gemak is hier een process gelijk gesteld aan een thread.. wat eigenlijk niet het geval is ... nee.. klopt.. zou dan ook multi-processing moeten zijn... ;)

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Mart! schreef op 15 November 2002 @ 10:50:
VB is niet multithreaded, dat wil dus zeggen dat hij NOOIT meerdere procedures tegelijk kan afhandelen, al lijkt dat wel zo. Je zult dus echt naar VB.net of C# of C++ moeten gaan om threads te kunnen gebruiken en zo dus meerdere zaken tegelijk af te handelen. De vraag is echter of je er snelheidswinbst uit haalt, dit is meer afhankelijk van welke functie (functionaliteit) je parallel wilt uitvoeren.
idd.. is het zeer de vraag of je er echte snelheidswinst mee maakt.. waarom wil je het eigenlijk
btw rustig mart.. "did not mean to offend you personally" met het woord "bullshit"..
offtopic:
toevoeging: Mart vinnik ook best lief :Y) maar ben wel al getrouwd hoor... :D

  • baskabas
  • Registratie: December 2000
  • Laatst online: 05-04 12:26
Henk: da's niet precies wat ik zoek, maar als mijn Timer methode niet werkt kan het iig wel zo proberen... thx!

Ik ga het toch eerst ff proberen met een een voorbeeldje wat ik via Google Groups heb gevonden. :7

Resolving Pointers Demo
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  Option Explicit
  ' demo project showing how to resolve an object pointer that was
  ' passed to an API function.
  ' by Bryan Stafford of New Vision Software® - newvision@mvps.org
  ' this demo is released into the public domain "as is" without
  ' warranty or guaranty of any kind.  In other words, use at
  ' your own risk.
  '
  ' Important Note: the method used in this demo is detailed in Bruce
  ' McKinney's book "Hardcore Visual Basic".  All credit for the idea
  ' belongs to Mr. McKinney
  
  Public Declare Function SetTimer Lib "user32" (ByVal hWnd&, ByVal nIDEvent&, ByVal uElapse&, ByVal lpTimerFunc&) As Long
  Public Declare Function KillTimer Lib "user32" (ByVal hWnd&, ByVal nIDEvent&) As Long
  Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes&)

  Private Const MESSAGE_1 As String = "See!!  I can callback!"
  Private Const MESSAGE_2 As String = "It worked again!"
  Private Const MESSAGE_3 As String = "You may be on to something!"
  Private Const MESSAGE_4 As String = "Resolving object pointers..."
  
Public Sub APITimerProc(ByVal hWnd&, ByVal uMsg&, ByVal idEvent&, ByVal dwTime&)
  
  Static nCapNum&, sCaption$
  
  ' kill the timer
  KillTimer hWnd, idEvent
  
  
  ' get a caption to set for the form
  nCapNum = nCapNum + 1
  
  Select Case nCapNum
    Case Is > 4: nCapNum = 0: sCaption = MESSAGE_1
    Case 1: sCaption = MESSAGE_1
    Case 2: sCaption = MESSAGE_2
    Case 3: sCaption = MESSAGE_3
    Case 4: nCapNum = 0: sCaption = MESSAGE_4
  End Select
  
  
  ' call the function that resolves the pointer so to
  ' a legal reference to our class object.  you can
  ' access any public properties or methods on the
  ' class from this reference.
  FormFromIDEvent(idEvent).Caption = sCaption
  
End Sub

Private Function FormFromIDEvent(ByVal idEvent&) As frmResolvePointer
  ' this function returns a reference to our form class
  
  ' dimension an object variable that we can copy the
  ' passed pointer into
  Dim lpForm As frmResolvePointer
    
  ' use the CopyMemory API function to copy the
  ' long pointer into the object variable.
  CopyMemory lpForm, idEvent, 4&
  Set FormFromIDEvent = lpForm
  CopyMemory lpForm, 0&, 4&
  
End Function


Als ik deze mijn procedure uit laat voeren, dan moet het lukken! Tenzij VB beslist dat procedure 2 op 1 moet wachten...

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Een pointer demo? How confusing can you get (pointers is toch heel iets anders voor C++ weer..)? .. maar nogmaals nog een keer om de vraag van Mart te herhalen.. waarom wil je het precies controleren? WOrdt het dan niet tijd om iets in C++ te gaan doen?

  • baskabas
  • Registratie: December 2000
  • Laatst online: 05-04 12:26
Ok... het idee is dit:

1. Ik haal uit een database een stel Polisnrs op waar ik wat informatie van wil weten.
2. Ik maak 2-8 objectjes aan die ieder hun eigen array nummertjes krijgen en een array-tje hebben voor de data in op te slaan. En dan nog wat properties met wat andere noodzakelijke info.

Het is dus de bedoeling dat die objecten allemaal naast elkaar aan de slag gaan met hun eigen connectie naar de services.

3. Alle objecten checken 1 voor 1 in als ze klaar zijn.
4. Als ze allemaal klaar zijn, dan wordt de data uit de objecten bijelkaar gezet in 1 array en geupload naar de database.
5. Het volgende process wordt gestart. (relaties ophalen, agenten ophalen ed.)
Back to step 1

De app is in princiepe af, maar de connectie lopen niet naast elkaar, maar na elkaar... daar ben ik dus mee bezig...

Er zit ondertussen al behoorlijk wat logica in, dus omschrijven naar C++ ofzo kost me veel te veel tijd, omdat ik nog niet zoveel met C++ gewerkt heb... zowieso zou het project (waar dit een onderdeeltje van is) in VB geschreven worden...

Ik ben natuurlijk wel C++ aan het leren! (in de vrije uurtjes die ik niet veel heb...*zucht*)

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

dus je wilt direct het ene en het andere "editten" in database aan opgehaalde recordsets.. wat dan niet in een go kan (of een query)? Die je dan weer stopt in een object (waarom)?
Lijkt me dan eerder een probleem van database structuur (of gewoon niet de goede query).. die je probeert op te lossen met VB? .. strange verhaal..
maar goed... jij je zin hoor...

  • baskabas
  • Registratie: December 2000
  • Laatst online: 05-04 12:26
Nee, ik wil voor bijv. alle Polisnummers in de database de meest actuele relatiegegevens hebben... die zijn alleen te krijgen via Service die aangesloten zitten op het Centrale Relatie Gevens (CRG) systeem... omdat de call's over 1 connectie te traag gaan heb ik besloten een applicatie te bouwen die de gegevens met 2-8 connecties ophaald, wat dus theoretisch een snelheidswinst van 200-800% op kan leveren, maar door de overhead is dat wat minder.

Het database model en/of een query verhaal staat hier dus niet te spraken, want dat is zoiets als SELECT pol_nr FROM t_polis WHERE jaar_maand = 200209 om de polisnummers op te halen. En met de gegevens die ik ophaal vul ik een nieuwe maand van een tabel... allemaal nieuwe records dus.

Waarom object? Verkeerd woord gebruikt... ik had een eigen Type gedefinieerd om om een aantal dingen van 1 connectie bijelkaar te houden en daar heb ik een array-tje van gemaakt, zodat alles mooi bijelkaar blijft...

Waarom ik het met VB doe is:
1. Tis de taal die ik het beste ken (heb ik in mijn MCSD gedaan)
2. Het hele project is in VB gemaakt en moet door een andere VB-er beheerd worden
3. Het leek me wel een uitdaging om eens een keer zoiets te maken.

Maargoed... back on-topic... ik ben nog niet helemaal klaar met die Timer API, maar zodra het af is zal ik hier de resultaten weer posten! :)

[ Voor 0% gewijzigd door baskabas op 15-11-2002 12:30 . Reden: ff wat toelichting erbij ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23-08 10:39

Janoz

Moderator Devschuur®

!litemod

Toch jammer... In principe zou je eigen kennis niet het belangrijkste argument moeten zijn bij zo'n keuze. Right tool for the job is hier meer van toepassing. IMHO ben je het jezelf alleen maar lastiger aan het maken. Persoonlijk zou ik eerder gaan voor een duale oplossing. Schrijf in c++ / c.net een dll oid die die gegevens via meerdere threads binnen haalt. Dan kun je gewoon je vb voor de rest blijven gebruiken, maar kun je je multithreaded gedeelte implementeren in iets waarin dit ook zonder lelijke hacks te implementeren is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • baskabas
  • Registratie: December 2000
  • Laatst online: 05-04 12:26
Daar geef ik je gelijk in, maar mijn manager niet... en dat is helaas wat telt in deze zaak...

De API Timer heeft het probleem helaas niet opgelost... hij wacht nu weer in VB binnen de functie die aangeroepen wordt door de Timer... het zou opgelost kunnen worden als ik de handle van een functie binnen de klasse waar mijn service calls gedaan worden te pakken zou kunnen krijgen, maar de AdressOf functie werkt helaas niet met klassen...

Weet iemand of/hoe je de handle uit de interne vtable zou kunnen lezen en of je die zou kunnen gebruiken bij de API?

Verwijderd

Wat je zou kunnen doen is de procedure die de service aanspreekt, in een activex exe zetten.
Daar een Classe inzetten die alleen een form load en daarna de controle aan de aanroepende procedure terug geeft.
In de form die geload wordt zet je een timer die de procedure gaat starten om de service aan te spreken.
Het opstarten van de verschillende active-x exe-s zal na elkaar gebeuren, maar ze zullen uiteindelijk wel naast elkaar (en in apparte threads) gaan runnen.

  • baskabas
  • Registratie: December 2000
  • Laatst online: 05-04 12:26
Ja idd... dan kan ik een handle aan die ActiveX exe's meegeven zodat die een soort van check-in procedure kunnen afvuren in mijn applicatie, die dan bijhoud welke allemaal ingecheckt zijn en als ze allemaal ingecheckt zijn, dan kan ik de data uitlezen en naar de database uploaden... tis niet zo netjes, maar het werkt volgens mij wel! ;)

  • Mart!
  • Registratie: Februari 2000
  • Laatst online: 23-08 14:17
Toevoeging aan hawk_eye: een activeX control (ocx) is natuurlijk ook een oplossing, daar kun je er dan 1 van in je project zetten en dan index=0. Vervolgens kun je met het load statement meer instanties van de control aanmaken.
Voordeel is dat je vanuit de ocx makkelijk events terug kan koppelen aan je hoofdprogramma d.n.v. een event.

pseudo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim done as integer

public sub getdata()
  done = 0
  for t = 0 to 9
    component(t).getdata()
  next
end sub

public sub component_datareceived(index as integer)
  done = done + 1
  if done = 10 then
     'ga verder met rest van programma
  end if
end public sub

Verwijderd

Reactie op Mart:

Nadeel van een ActiveX control is alleen dat die in dezelfde thread draait als de 'host'. Een activeX draait in een eigen thread.

  • Mart!
  • Registratie: Februari 2000
  • Laatst online: 23-08 14:17
Dat zou kunnen, daar laat de kennis van die dingen mij een beetje in de steek... :)

Kun je trouwens een activeX exe een event laten genereren terug naar het aanroepende programma? Heb het al wel gebruikt met vb-classes en activeX componenten (ocx-en), mar nog nooit met activeX exe's...

Verwijderd

Tuurlijk, geen enkel probleem.
Let er wel op dat je de interface-classe in de activex exe 'singleuse' maakt, anders worden er niet meerdere instances aangemaakt.

EDIT

Ik heb net even een testje gemaakt en het lukt om bijv 20 instances van een activex exe naast elkaar te laten lopen, terwijl de aanroepende applicatie niet 'gelocked' is, maar de snelheid/instance gaat toch ongeveer evenredig met het aantal instances naar beneden.
Multi-thread en asynchroon werkt toch niet zo lekker als ik gedacht had.... :?

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Verwijderd schreef op 15 November 2002 @ 14:17:
Reactie op Mart:

Nadeel van een ActiveX control is alleen dat die in dezelfde thread draait als de 'host'. Een activeX draait in een eigen thread.
mm dat wist ik niet..

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 09:23

johnwoo

3S-GTE

Mart! schreef op 15 november 2002 @ 10:50:
VB is niet multithreaded, dat wil dus zeggen dat hij NOOIT meerdere procedures tegelijk kan afhandelen, al lijkt dat wel zo. Je zult dus echt naar VB.net of C# of C++ moeten gaan om threads te kunnen gebruiken en zo dus meerdere zaken tegelijk af te handelen. De vraag is echter of je er snelheidswinbst uit haalt, dit is meer afhankelijk van welke functie (functionaliteit) je parallel wilt uitvoeren.
Funny.. ik heb WinBar in VB gemaakt, en als ik mn taskmanager open zie ik toch echt dit:
Afbeeldingslocatie: http://lunenburg.xs4all.nl/zooi/winbarthreads.gif
Je zou haast gaan denken dat dat 6 threads zijn :o

Nu zijn deze threads gemaakt en beheerd door VB zelf, maar als ik zelf graag een thread wil maken kan ik dat best voor elkaar krijgen met de CreateThread API. Niks ingewikkelds aan.

Conclusie: je bewering gaat niet in alle gevallen op, en is verkeerd geformuleerd. De VB runtime (wat je bedoelt met de term "VB" neem ik aan) is wel multithreaded. Standaard VB programma's zijn dat niet (dit is wat je bedoelde lijkt me), maar ze kunnen het prima gemaakt worden. CreateThread werkt in een VB executable precies hetzelfde als in een C++ executable.

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Ik heb m'n testje ge-upload.
Het werkt wel - er worden meerdere threads aangemaakt, maar echt sneller wordt het er niet van. Eigenlijk zou ik nog moeten testen wat er gebeurt als ik de procedures na elkaar uitvoer ipv tegelijkertijd.

http://home.hetnet.nl/~brendaenudo/files/test.zip
Pagina: 1