thread synchronisieren



  • hoi. ich suche eine möglichkeit 2 threads zu synchronisieren. Auf den einen thread hab ich zugriff und kann soviel code ausführen wie ich will jedoch hab ich im 2. thread keine möglichkeit code auszuführen. (es handelt sich um einen thread eines anderen prozesses)

    bis jetzt hab ich es mit suspendthread() und resumethread() gemacht wovon jedoch überall abgeraten wird und ich auch von zeit zu zeit race conditions bekomme.

    Was gibts noch für eine möglichkeit? Für events muss ich ja code im 2. thread ausführen was mir nicht möglich ist.



  • Starte den 2. Prozess und beende ihn wieder. Was anderes bleibt DIr nicht übrig. Alternativ kannst Du den Hersteller anrufen und um Hilfe bitten.



  • Jochen Kalmbach schrieb:

    Starte den 2. Prozess und beende ihn wieder. Was anderes bleibt DIr nicht übrig. Alternativ kannst Du den Hersteller anrufen und um Hilfe bitten.

    hm suspendthread und resumethread kann man nicht irgendwie so benützen ,dass sie einigermaßen thread safe wirken?



  • Nur wenn Du den Prozess debuggen willst.



  • @lekos
    Je nachdem wie das andere Programm aufgebaut ist, könnte man u.U. tricksen.

    Erstmal müsstest du eine DLL injecten (wie das geht sollte sich ergoogeln lassen, hab's selbst noch nie gemacht aber ist keine Rocket-Science EDIT: brauchst du doch nicht, siehe unten /EDIT).
    Dann müsstest du in der DLL die ThreadID des Haupt-Threads rausbekommen (z.B. Fenster suchen und dann GetWindowThreadProcessId).
    Dann kannst du mit SetWindowsHookEx() einen WH_CALLWNDPROC Hook setzen.

    Und dann kannst du von deinem Prozess aus eine Nachricht broadcasten.
    Dazu registrierst du z.B. einfach eine Message (RegisterWindowMessage), und broadcastest die dann (PostMessage + HWND_BROADCAST).

    Im fremden Prozess wird dann der WH_CALLWNDPROC Hook aufgerufen. Im Hook ignorierst du einfach alles bis auf die registrierte Nachricht.
    Und wenn die registrierte Nachricht daherkommt, dann kannst du da drinnen z.B. warten bis der eigenen Prozess fertig ist mit was auch immer er machen will.

    Das sollte funktionieren, wenn der fremde Prozess 1) ein Top-Level Window hat 2) die Dinge die es zu synchronisieren gilt im Haupt-Thread erledigt und 3) so erledigt dass dazwischen keine Window-Messages bearbeitet werden.

    Ist natürlich ein Hack, und wenn du eine andere Möglichkeit findest, die garantiertermassen funktioniert, wäre das vermutlich die bessere Wahl. Und es kommt wie gesagt auf das andere Programm an, aber ich vermute dass man damit zumindest nicht ganz schlechte Chancen hat.

    EDIT
    ps: Sehe gerade ... SetWindowsHookEx kann anscheinend auch Hooks in anderen Prozessen setzen. Die DLL brauchst du trotzdem (die muss ja in den anderen Thread geladen werden), aber zumindest sparst du dir den DLL-injection Teil - weil Windows das für dich übernimmt.


Anmelden zum Antworten