Results 1 to 8 of 8

Thread: Cancel button and CreateAnonymousThread

  1. #1

    Cancel button and CreateAnonymousThread

    Hoi,

    Code:
      var MyThread: TThread;
    
      UseThreaded := True;
      if (UseThreaded) then
      begin
        { Threaded Mode }
        MyThread := TThread.CreateAnonymousThread(
        procedure
        begin
          TThread.Synchronize(TThread.Current, procedure
          begin
            StartProcess(Sender);
          end);
        end); //.Start;
    
        MyThread.FreeOnTerminate := False;
        MyThread.Start;
        MyThread.WaitFor;
        MyThread.Free;
      end
      else
      begin
        { Normal Mode }
        StartProcessMusicThread(Sender);
      end;
    Code:
      procedure StartProcess(Sender: TObject);
      begin
        for Index := 0 to Pred(FoundFolders.Count) do
        begin
          FullPath := FoundFolders[Index];
          ShowInformation; // Naar TLabel
          Inc(ProcessMusic.TagProcessRec.FolderRead);
          ProcessMusic.AddPrivatePath(Sender, FullPath);
          if (__CANCEL) then Break;
        end;
      end;
    Dit hier boven werkt goed maar ik zou die WaitFor willen veranderen zodat ik een __CANCEL kan gebruiken zodat de Thread stopt? Dat gaat dus niet.
    Iemand een idee want ik kom niet verder? Op deze manier kan je ook niet je knop Annuleren indrukken.


    Groetjes.

  2. #2
    Delphi Code:
    1. MyThread.FreeOnTerminate := False;
    2.     MyThread.Start;
    3.     MyThread.WaitFor;
    4.     MyThread.Free;

    Dat eerste stuk code slaat volgens mij nergens op. Je maakt een thread, start deze, en gaat er dan (blocking) op wachten. Je kan dan net zo goed (beter zelfs) gewoon het stukje code uitvoeren. Bovendien wordt de code in die thread ook weer gesynchronized, dus zelfs zonder die WaitFor zal al het werk effectief in de hoofdthread plaatsvinden..

    Wordt dat eerste stuk code uit weer een andere thread uitgevoerd? Als dat in de main thread gebeurt, dan start deze een thread en gaat wachten, terwijl die thread weer probeert te synchronizen. Volgens mij zou je dan een deadlock moeten krijgen.

    Ik zou het kunnen verbeteren, maar ik snap eigenlijk niet eens goed wat je er precies mee wilt bereiken en wat er vanuit waar wordt uitgevoerd.
    1+1=b

  3. #3
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Het enige zinnige lijkt mij startprocess(sender); Als er al een nut is aan het threading gebeuren is het vertrouwen op implementatie details (zoals dat synchronize alle messages verwerkt (processmessages) voor het returned van synchronize of zo).

    En dat kan je allemaal met een simpel application.processmessages voor en na het startprocess ook oplossen, daar heb je het thread gedoe niet voor nodig.

  4. #4
    Het startprocess(sender) gebeuren duurt ongeveer 30 minuten tot 2 uur aan de hand van het lezen van TAGS uit een aantal (30.000-200.000) mp3 nummers. Hiervoor gebruik ik MediaInfo.Dll - http://MediaArea.net/MediaInfo.
    Nu kan je voorstellen dat je na 5 minuten denk ik ga eens even annuleren maar dat gaat niet met een aparte Button waar (__CANCEL) op True wordt gezet.
    Eigenlijk dacht ik dit zo op te lossen maar snap hier de punten. Ik wil dus iets maken dat deze lus kan afbreken. Misschien kan ik een ESC afvangen in de lus zelf en de Thread overboord gooien.

    Laat dus deze post maar voor wat het is en deze meneer gaat op de ESC toer.

    UPDATE: Probleem opgelost.

    Code:
      function Afbreken: Boolean;
      var
        GetKey: SmallInt;
        ResultCode: Word;
      begin
        Result := False;
        GetKey := GetAsyncKeyState(VK_ESCAPE);
        GetAsyncKeyState(VK_ESCAPE); // Flush
        if (GetKey <> 0) then
        begin
          Application.ProcessMessages;
          ResultCode := MessageDlg('GetAsyncKeyState(VK_ESCAPE) <> 0', mtConfirmation, [mbOk, mbCancel], 0);
          GetAsyncKeyState(VK_ESCAPE); // Flush after possible MessageDlg Escape
          Result := (ResultCode = mrOk);
          __CANCEL := Result;
        end;
      end;
    Ik ben er klaar mee...
    Last edited by DragonFly; 08-Jun-19 at 11:44.

  5. #5
    wat nu ? Niemand die even de links naar de artikelen over "Application.ProcessMessages is bad post

  6. #6

  7. #7
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Code:
    Most people consider it a better solution to use a separate thread for executing your code and just send signals to the main thread when it needs to update a label or a progress bar. That way, the main thread is idle all the time, and will keep responding to mouse clicks etc.
    Probleem hiermee is dat het gedeelte "executing your code" absoluut niet geinteresseerd is in een GUI of whatever.
    Het zou andersom moeten in mijn ogen: dus kijk om de zoveel tijd "hoever" je code is.
    Maar hiervoor heb ik nog nooit een goede oplossing onder ogen gehad.

  8. #8
    Hangt ervan af wat je wilt. Wil je de uitkomsten live in je UI hebben, dan is het wél belangrijk. Wil je alleen de voortgang weten, dan is het minder belangrijk dat je alles hebt, en is pollen misschien handiger.
    Last edited by GolezTrol; 17-Jun-19 at 18:24.
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •