Inter-thread communication (worker-threads)
Habe ich zwei threads A & B mit CreateThread windows API. Ich bin versucht, senden Sie die Daten von thread A nach B.
Ich weiß, dass ich verwenden können Event-Objekt, und warten Sie, bis die Ereignis-Objekt in einem anderen mit "WaitForSingleObject" - Methode. Was dieses Ereignis wird alle wird nur das signal der thread. Das ist es! Aber wie kann ich senden Daten. Ich möchte auch nicht thread B zu warten, bis thread A-Signale. Es hat seinen eigenen job zu tun. Ich kann es nicht abwarten.
Ich kann nicht finden, eine Windows-Funktion, die es mir ermöglichen, das senden von Daten an /von den worker-thread und main-thread verweisen auf die worker-thread-entweder mit der thread-ID oder durch das zurückgegebene HANDLE. Ich will nicht die Einführung der MFC-Abhängigkeit in meinem Projekt und würde gerne Anregungen zu hören, wie andere würden oder getan haben, in dieser situation. Vielen Dank im Voraus für jede Hilfe!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste von allen, sollten Sie Bedenken, dass Windows stellt eine Reihe von Mechanismen zum Umgang mit threading für Sie: I/O Completion Ports, alten-thread-pools und neue thread-pools. Je nachdem, was Sie tun, jede von Ihnen könnte nützlich sein, für Ihre Zwecke.
Als auf "senden", die Daten von einem thread zu einem anderen, Sie haben ein paar Möglichkeiten. Windows message queues sind thread-sicher, und ein thread (auch wenn Sie nicht über ein Fenster) kann eine message-queue, die Sie Nachrichten senden, um mit
PostThreadMessage
.Habe ich auch gepostet-code für eine thread-sichere queue in eine andere Antwort.
Soweit dass der thread weiter ausgeführt werden, aber beachten Sie, wenn eine änderung passiert, ist die typische Methode ist, um es nennen
WaitForSingleObject
mit einem timeout-Wert von 0, dann überprüfen Sie den Rückgabewert-wenn esWAIT_OBJECT_0
, das Ereignis (oder was auch immer) eingestellt wurde, so muss es zur Kenntnis zu nehmen, das zu ändern. Wenn esWAIT_TIMEOUT
gab es keine Veränderung, und es kann weiter ausgeführt werden. So oder so,WaitForSingleObject
sofort zurückgegeben.Da die beiden threads im gleichen Prozess (zumindest das, was es klingt), dann ist es nicht notwendig, Sie zu "versenden" von Daten. Sie teilen kann (z.B., eine einfache Globale variable). Müssen Sie synchronisieren, Zugang entweder über ein Ereignis, semaphore, mutex, etc.
Je nachdem, was du machst, es kann ganz einfach sein.
Wenn man sich mit der Minimierung von Windows-Abhängigkeiten, und vorausgesetzt, dass Sie Programmierung in C++, dann empfehle ich die Verwendung von Boost.Threads, das ist ein sehr schöner, Posix-ähnliche C++ threading-Schnittstelle. Dies wird Ihnen eine einfache Portabilität zwischen Windows und Linux.
Wenn Sie diesen Weg gehen, dann verwenden Sie einen mutex zum Schutz gemeinsam genutzten Daten auf mehrere threads, und eine Zustand-variable (in Verbindung mit dem mutex) signal zu einem thread aus dem anderen.
Dont verwenden Sie eine Mutexe, wenn nur in einem einzigen Prozess, denn es hat mehr Aufwand (da es eine system-weite definierten Objekt)... Stelle einen kritischen Abschnitt dar, um Ihre Daten und versuchen Sie es zu betreten (als Jerry Sarg hat in seinem code, um für die thread-sichere queue).