Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Delphi] Winamp plugin + Threads

Pagina: 1
Acties:
  • 154 views sinds 30-01-2008
  • Reageer

  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-11 16:26
Ok ik ben dus bezig met het schrijven van een plugin voor winamp. Dat lukt allemaal wel, maar nu heb ik een thread nodig die wat download. Dus ik ben bezig gegaan, heb een classe gemaakt die erft van TThread. Dat is allemaal geen probleem. Het starten lukt, de thread download wat ie moet downloaden, maar hij komt nooit bij de onterminate event aan. Nu het rare van alles, als ik na het aanmaken van de thread een showmessage doe, werkt het allemaal perfect.

Code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function Init : Integer;
begin
  Result := 0;
  try
    WinampVer := SendMessage(Plugin.hwndParent, WM_WA_IPC, 0, IPC_GETVERSION);
    Timer := TTimer.Create(nil);
    Timer.Interval := 1000;
    Timer.OnTimer := EventHandlers.OnTimer;

    ShowMessage('start');
    DownloadThread := TDownloadThread.Create('http://www.google.nl');
    DownloadThread.OnTerminate := EventHandlers.OnThreadDone;
    ShowMessage('eind');
    //snap
  except
    result := 1;
  end;
end;

Procedure TEventHandlers.OnThreadDone(Sender: TObject);
begin
  DownloadThread := nil;
  ShowMessage('Poof');
end;


nou vraag ik mij af, wat doet showmessage waardoor de code opeens wel werkt...

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Het lijkt me dat de showmessage je thread voldoende kans geeft om in de tussentijd z'n werk te doen; zonder de showmessage wordt 'ie te vroeg afgebroken lijkt me en dan lijkt me dat weer het resultaat van de scope van je var of zoiets (ben geen Delphi kenner) ;)

[ Voor 7% gewijzigd door RobIII op 19-07-2007 01:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-11 16:26
ja dat dacht ik in eerste instantie ook, toen heb ik sleep(2000) neer gezet (kan niet lang genoeg zijn he :P) en application.processmessage ook geprobeert... maar dat mocht niet baten

edit:

Het werkt nu met een lelijke oplossing, maar wat ik nu doe is gewoon zelf de OnTerminate aanroepen aan het einde van de execute. Jammer dat het zo moet, maar het werkt :)

[ Voor 33% gewijzigd door Cypher87 op 19-07-2007 16:00 ]


  • remco_k
  • Registratie: April 2002
  • Laatst online: 08:28

remco_k

een cassettebandje was genoeg

Dit is wel gevaarlijke code hoor.
Delphi:
1
2
3
4
    DownloadThread := TDownloadThread.Create('http://www.google.nl'); 
    // het zou kunnen dat de thread al klaar is voordat de regel hieronder uit word gevoerd.
    // met als gevolg dat OnThreadDone nooit aan word geroepen.
    DownloadThread.OnTerminate := EventHandlers.OnThreadDone; 

Ik ben niet zo into delphi maar kan je de thread niet beter in suspend mode aanmaken en pas later starten?
Delphi:
1
2
3
4
    DownloadThread := TDownloadThread.Create('http://www.google.nl');  // in Create moet je regelen dat de thread niet meteen word gestart. (Misschien iets met CreateSuspended=true)
    DownloadThread.OnTerminate := EventHandlers.OnThreadDone; 
    DownloadThread.Resume(); // (of .Start() of .WhatEverItIsInDelphi())
    // de thread word op bovenstaande regel pas uitgevoerd, waardoor je zeker weet dat OnTerminate is gezet.


Dit kan natuurlijk ook: (en prefereerd mijn voorkeur)
Delphi:
1
2
    // gewoon alles als parameter meegeven en in de Create functie OnThreadDone aan OnTerminate toewijzen.
    DownloadThread := TDownloadThread.Create('http://www.google.nl', EventHandlers.OnThreadDone);
Cypher87 schreef op donderdag 19 juli 2007 @ 01:29:
ja dat dacht ik in eerste instantie ook, toen heb ik sleep(2000) neer gezet (kan niet lang genoeg zijn he :P) en application.processmessage ook geprobeert... maar dat mocht niet baten

edit:

Het werkt nu met een lelijke oplossing, maar wat ik nu doe is gewoon zelf de OnTerminate aanroepen aan het einde van de execute. Jammer dat het zo moet, maar het werkt :)
Dat is raar en hoort niet dat wijst er meestal op dat je niet (of niet foutloos) uit de Execute() functie komt... Wat heb je in de Create() en Execute() functies staan van je thread?

[ Voor 21% gewijzigd door remco_k op 19-07-2007 16:20 ]

Alles kan stuk.


  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-11 16:26
De .Resume oplossing werkt ook niet. Had ik ook al eens geprobeert. Om te testen had ik voor het gemak de execute leeg gelaten.
Ik heb trouwens de classe nog even geprobeert in een stand-alone applicatie (dus niet als winamp plugin) en daarmee werkt de code vlekkenloos...

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 27-11 15:14

ZaZ

Tweakers abonnee

Ik heb me ook een keer rot gezocht wat het probleem nou was met een thread maken in een dll in Delphi. In een standalone werkte ie bij mij ook zonder problemen.
http://codecentral.borland.com/Item.aspx?id=21148
Die file toevoegen aan en het werkt waarschijnlijk weer allemaal.

Lekker op de bank


  • Little Penguin
  • Registratie: September 2000
  • Laatst online: 08-06 20:43
Het is misschien wel handig als je aangeeft welke Delphi versie je gebruikt, ten slotte is van alles mogelijk (Delphi 4,5,6,7, 2006, 2007...) - verder kun je zelf in een groot deel van de broncode van Delphi duiken als je een gekochte standard of enterprise editie gebruikt.

Verder hoeven wij ons natuurlijk ook niet meer in te spannen als je tevreden bent met de QD-fix die je nu zelf bedacht hebt :)

Overigens is het, mocht je geïnteresseerd zijn in een niet QD-oplossing, wel handig als je ook aangeeft hoe je precies de Application.ProcessMessages code geimplementeerd hebt. Als je dit niet d.m.v een while-loop+downloaded flag gedaan hebt zou je dat nog een keer kunnen overwegen...

  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 23-11 16:26
@zaz
Dat werkte voor mij niet, gaf zelfde resultaat

@little penguin
Ik gebruik delphi 7 enterprise. Ik heb idd de broncode bekeken, maar ik word er niet wijzer uit. Denk dat het een synchronizatie probleem is oid.
Het werkt nu perfect. En als er geen oplossing is voor dit probleem dan heb ik geen andere keuze dan het zo te laten, niet? Opzich brengt het geen problemen met zich mee, teminste niet voor zover ik tot nu toe vernomen heb. Maar ik ben wel benieuwd wat nou het probleem is.

[ Voor 1% gewijzigd door Cypher87 op 19-07-2007 23:44 . Reden: rare zin O_o ]


  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 27-11 15:14

ZaZ

Tweakers abonnee

Heb je 'm wel toegevoegd aan je uses in je dll project?
bijv.
code
Delphi:
1
uses D6DLLSynchronizer in 'D6DLLSynchronizer.pas'


Het klinkt namelijk als exact hetzelfde probleem wat ik had. En na een tijdje zoeken bleek dat een thread spawnen vanuit een dll in delphi6 en 7 een verhaal apart is vanwege het synchroniseer gebeuren.

Lekker op de bank

Pagina: 1