Benutzen von Synchronize() bzw __closure



  • Hallo,

    ich habe einen Thread (RunDThread) laufen, der eine fremde exe ca 5000 mal aufruft. Im Hauptprogramm wird nach jedem Aufruf ein Fortschrittsbalken aktualisiert.
    Ich habe mitbekommen, dass ich dafür Synchronize() verwenden muss.
    Synchronize(UpdatePb); aus RunDThread::Execute() aufgerufen klappt auch. wobei:

    void __fastcall RunDThread::UpdatePb()
    {
      MainForm->FilesProcessedPb->UpdatePbby(1);
    }
    

    Das war aber nur ein workaround, weil

    Synchronize(MainForm->FilesProcessedPb->UpdatePbby(1));
    

    dirket aus RunDThread::Execute() nicht klappen wollte.

    Da ich jetzt aber noch zusätzlich den bearbeiteten Filenamen in das Statuswindow schreiben will muesste ich
    Synchronize(UpdatePb); in Synchronize(UpdatePb(myAnsiString)); ändern bzw. direkt aus RunDThread::Execute()

    Synchronize(MainForm->AddtoStatusWindow(this,"bearbeite: "+myAnsiString));
    

    aufrufen. Das klappt aber nicht:

    [C++ Fehler] rdthread.cpp(74): E2468 Ein Wert vom Typ void ist nicht zulässig
    [C++ Fehler] rdthread.cpp(74): E2342 Keine Übereinstimmung des Typs beim Parameter 'Method' ('void (_fastcall * (_closure )())()' erwartet, 'void' erhalten)

    Mein workaround rächt sich jetzt also - wie üblich 🙂
    Ich vermute, dass ich verstehen muesste, was es mit __closure auf sich hat. Leider hat die Hilfe mir keine Lichter aufgehen lassen. Vielleicht kann das jemand von euch ?



  • Hi,

    das ist ein etwas anderer Funktionspointer.

    'void (_fastcall * (_closure )())()'

    ist ein Funktionspointer, welcher zu solch einer Methode passen würde:

    void _fastcall DoSomethingSynchronized()
    {
      // böse Sachem mit anderen Resourcen
    }
    

    du kannst also keine Methode synchronisieren, die ein Parameter oder ein Rückgabewert besitzt.
    Deshalb bekommst du die Fehlermeldung.



  • Danke für die Antwort!
    Ok, also kann ich keinen Wert übergeben. Wie kann ich denn dann einen AnsiString aus einem Thread in dem Hauptprogramm ausgeben?



  • ich nehme bei sowas dann immer ne (private) variable.



  • hmm, logisch, hätte ich auch selbst drauf kommen können.
    Danke für eure Hilfe.


Anmelden zum Antworten