Ik heb hier een vrij forse VB6 applicatie liggen waarvan een gedeelte van de code eigenlijk beter in een eigen thread terecht kan.
Nou weet ik dat threading in VB6 een no-go is. Het is via allemaal omwegen wel te doen, maar stabiel zal het nooit worden.
Dus ik dacht eraan om een stdcall dll wrapper te maken in delphi als snelle oplossing.
De betreffende code van de VB app stop ik in een COM dll
De stdcall dll maakt een thread en roept daarin het COM object aan
De VB6 app gaat lekker verder en als de thread van de dll klaar is doet ie een callback om de VB6 app op de hoogte te stellen.
Nou weet ik dat het niet de mooiste oplossing is, maar herschrijven is gewoon soms geen optie met grotere applicaties.
Efin, alles lijkt goed te gaan behalve 1 ding:
Als ik bijvoorbeeld in de stdcall dll een Sleep uitvoer van, laten we zeggen, 10 seconden dan werkt alles zoals je zou verwachten.
De VB6 app lijkt niets door te hebben en hij heeft zijn eigen thread lekker vrij.
Maar als ik in de nieuwe thread van de stdcall dll het COM object aanroep, dan hangt de VB6 app alsof het in zijn eigen thread gebeurt!
Dingen die ik heb geprobeerd:
In de stdcall dll een sleep uitvoeren, maar daar doet het probleem zich niet voor.
In de stdcall dll een busy loop maken die van alles doet om te kijken of het komt doordat de thread op een of andere manier toch teveel cpy cycles opeist, maar ook daar geen problemen.
In de COM dll een sleep zetten, maar dan hangt de applicatie dus weer.
De thread spawn ik uiteraard in de idle priority class voor deze tests.
Het enige wat ik me zou kunnen bedenken is dat de COM dll ook de VB6 runtime gebruikt en dat het daar ergens misgaat.
Ik heb alleen helaas niet echt veel verstand van al het echte low level gebeuren.
Misschien is er iemand die er wat meer info over heeft?
Nou weet ik dat threading in VB6 een no-go is. Het is via allemaal omwegen wel te doen, maar stabiel zal het nooit worden.
Dus ik dacht eraan om een stdcall dll wrapper te maken in delphi als snelle oplossing.
De betreffende code van de VB app stop ik in een COM dll
De stdcall dll maakt een thread en roept daarin het COM object aan
De VB6 app gaat lekker verder en als de thread van de dll klaar is doet ie een callback om de VB6 app op de hoogte te stellen.
Nou weet ik dat het niet de mooiste oplossing is, maar herschrijven is gewoon soms geen optie met grotere applicaties.
Efin, alles lijkt goed te gaan behalve 1 ding:
Als ik bijvoorbeeld in de stdcall dll een Sleep uitvoer van, laten we zeggen, 10 seconden dan werkt alles zoals je zou verwachten.
De VB6 app lijkt niets door te hebben en hij heeft zijn eigen thread lekker vrij.
Maar als ik in de nieuwe thread van de stdcall dll het COM object aanroep, dan hangt de VB6 app alsof het in zijn eigen thread gebeurt!
Dingen die ik heb geprobeerd:
In de stdcall dll een sleep uitvoeren, maar daar doet het probleem zich niet voor.
In de stdcall dll een busy loop maken die van alles doet om te kijken of het komt doordat de thread op een of andere manier toch teveel cpy cycles opeist, maar ook daar geen problemen.
In de COM dll een sleep zetten, maar dan hangt de applicatie dus weer.
De thread spawn ik uiteraard in de idle priority class voor deze tests.
Het enige wat ik me zou kunnen bedenken is dat de COM dll ook de VB6 runtime gebruikt en dat het daar ergens misgaat.
Ik heb alleen helaas niet echt veel verstand van al het echte low level gebeuren.
Misschien is er iemand die er wat meer info over heeft?