Ik heb een programma. Dit programma gebruikt DLLs. De DLLs kunnen aan het programma vragen om een URL te downloaden. Deze wordt als return van de functie meegegeven.
maw:
(in plugin) -> DownloadURL(...) -> je krijgt resultaat.
Nu is het zo dat als ik een URL download, dat mijn programma volledig locked. Akkoord, dat is normaal en ligt aan mijn implementatie van DownloadURL.
Nu zou ik natuurlijk (omdat het aantal plugins kan stijgen) een soort van "Download-pool" willen maken zodat de plugins allemaal tegelijk kunnen vragen aan mijn main programma om een URL te downloaden.
Probleem daarbij is dan dat ik moet gaan werken met threads. Niet het werken met die threads is het probleem, maar eerder de logica erachter.
Laat me eventjes proberen duidelijker te zijn.
Op dit moment 'locked' de plugin en het hoofdprogramma totdat de URL is gedownload.
Als ik nu met threads zal gaan werken zou ik eigenlijk OOK als returnwaarde van die functie de gedownloadde URL willen meegeven.
Dit kan ik gerust doen door bvb een ::Sleep(xx) te doen.
[vraag1: locked Sleep() ook mijn andere threads, of enkel de GUI/main programma?]
Het beste natuurlijk wat ik kan doen is met een "event system" gaan werken...
Dus gewoon een thread afvuren, en dan wachten op de event. Op die manier moet ik ook niet "sleep"-en.
Maar dan zit ik wel met het probleem dat ik niet meer het resultaat kan returnen als uitkomst van de DownloadURL-functie...
[vraag2: Heeft er iemand enig idee hoe ik dit probleem kan oplossen? Op dit moment bestaat de mogelijkheid nog om de API van de plugins te wijzigen.]
Moest ik ergens onduidelijk geweest zijn, gelieve dan meer info te vragen
maw:
(in plugin) -> DownloadURL(...) -> je krijgt resultaat.
Nu is het zo dat als ik een URL download, dat mijn programma volledig locked. Akkoord, dat is normaal en ligt aan mijn implementatie van DownloadURL.
Nu zou ik natuurlijk (omdat het aantal plugins kan stijgen) een soort van "Download-pool" willen maken zodat de plugins allemaal tegelijk kunnen vragen aan mijn main programma om een URL te downloaden.
Probleem daarbij is dan dat ik moet gaan werken met threads. Niet het werken met die threads is het probleem, maar eerder de logica erachter.
Laat me eventjes proberen duidelijker te zijn.
Op dit moment 'locked' de plugin en het hoofdprogramma totdat de URL is gedownload.
Als ik nu met threads zal gaan werken zou ik eigenlijk OOK als returnwaarde van die functie de gedownloadde URL willen meegeven.
Dit kan ik gerust doen door bvb een ::Sleep(xx) te doen.
[vraag1: locked Sleep() ook mijn andere threads, of enkel de GUI/main programma?]
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| string DownloadURL( string url ) { if ( url.empty() ) return ""; string result; bool ThreadHasStoppedLeeching( false ); DownloadThread *thread = new DownloadThread( url, result, ThreadHasStoppedLeeching ); thread->Run(); while ( !ThreadHasStoppedLeeching ) ::Sleep(100); return result; } |
Het beste natuurlijk wat ik kan doen is met een "event system" gaan werken...
Dus gewoon een thread afvuren, en dan wachten op de event. Op die manier moet ik ook niet "sleep"-en.
Maar dan zit ik wel met het probleem dat ik niet meer het resultaat kan returnen als uitkomst van de DownloadURL-functie...
[vraag2: Heeft er iemand enig idee hoe ik dit probleem kan oplossen? Op dit moment bestaat de mogelijkheid nog om de API van de plugins te wijzigen.]
Moest ik ergens onduidelijk geweest zijn, gelieve dan meer info te vragen