İki pencereden oluşan bir uygulama var, biri diğerine iletişim kurar ve iki tam sayı içeren bir yapı (Bu durumda iki zar bir zar) gönderir.İşlemler aracılığıyla olay sinyali gönderme - C
aşağıdaki durumlar için olaylar kullanarak olacak: dönüş kapatma işlemi b
- yöntem a b işlemek için veri gönderir, süreç b verileri gösterir
- işlem bir kapatır, a, sırasıyla, bir kapanış işlemine ilişkin olarak bir
İkinci işlem sürekli olarak ilk işlemin veri göndermesini beklerse programın beklemede kaldığını fark ettim. Her işlemdeki iş parçacığı uygulama fikri gerçekleşti ve bunu zaten uygulamaya başladım.
Sorun şu ki, iş parçacığı ve olaylarla çok fazla deneyimim olmadığından, yapmak istediklerimi gerçekleştirmenin en iyi yolundan emin değilim.
Diğer işlemin ne yapılacağını görmesi için olayın nasıl yapılacağını bilmesini sağlamaya çalışıyorum, bir başkasından ayrı olan bir işlemin nasıl olduğunu anlayamıyorum. Olayların özellikle olay değiştiği anda harekete geçmesi gerektiği gibi olduğunu belirtir. Herhangi bir yardım için
Teşekkür
Düzenleme: Ben sadece kullanabilirsiniz
olaylar için/Set/Açık yöntemleri oluşturma, daha önce söz için özür.
Ayrıca, A olayında, kullanıcının yakın olayı dinlerken uygulama ile etkileşimde bulunmasına olanak veren yeni bir iş parçacığı oluşturuyorum.
oluşturma ipliği: B kapatır A
hCreateEventThread = CreateThread(
NULL, // lpThreadAttributes (default)
0, // dwStackSize (default)
ThreadFunc, // lpStartAddress
NULL, // lpParameter
0, // dwCreationFlags
&hCreateEventThreadID // lpThreadId (returned by function)
);
if(hCreateEventThread != NULL)
{
MessageBox(hMainWindow,L"Thread created!",L"Success!",MB_OK);
}
açma olayı (WM_CREATE olarak b) 'de
DWORD WINAPI ThreadFunc(LPVOID passedHandle)
{
hConsumerCloseEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("Global\\ConsumerCloseEvent"));
while(TRUE)
{
dwCloseResult = WaitForSingleObject(hConsumerCloseEvent,INFINITE);
switch (dwCloseResult)
{
// State of object is signalled
case WAIT_OBJECT_0:
//Consumer has closed, exit program.
//CloseHandle(hDiceRoll);
//CloseHandle(hCloseEvent);
//CloseHandle(hCreateEventThread);
ExitProcess(1);
break;
default:
return;
}
}
}
oluşturma olayı:
hConsumerCloseEvent = CreateEvent(
NULL, // default security attributes
TRUE, // manual-reset event
TRUE, // initial state is nonsignaled
TEXT("Global\\ConsumerCloseEvent") // object name
);
if(hConsumerCloseEvent == NULL)
{
MessageBox(hMainWindow,L"CreateEvent failed",L"Error",MB_OK);
}
B kapandığında sinyal olay Ayar : Olay sinyal verilmesi durumunda, uygulama A kapatmak için ayarlanır görebileceğiniz gibi
case WM_DESTROY:
{
SetEvent(hConsumerCloseEvent);
PostQuitMessage(0);
break;
}
. Her iki uygulamayı çalıştırdığımda ve B işlemini kapattığımda, A işlemi değiştirilen sinyali fark etmez ve kapanmaz.
Düzenleme 2:
GetLastError() kullanılması; Ben OpenEvent için tanıtıcı NULL olduğunu tespit edebildi, verilen hata
mi etkinliği oluştururken benim yöntemi ve Yanlış okumak, Global \ prefix'i dahil ettiğinizden emin oldum.ERROR_FILE_NOT_FOUND olduğunu - 2: dosyayı bulamıyor sistem belirtilen
Sağladığınız her örnek için niçin yinelenen olaylar kümeniz olduğunu anlamıyorum, ayrıca her işlemin diğerinin durumu değiştirdiğini nasıl anlatabilirim? Herhangi bir sebepten dolayı, olayı yanlış olarak ayarladığım halde, programın hala sinyal verildiğini görürsünüz, bu hiç mantıklı değil. –
Aslında bir iki olay kümesi. Adların aynı olduğuna dikkat edin, ilk işlem, bunları oluşturacak, ikincisi ise önceden varolan olayların bir tanıtıcısını alacaktır. Her iki durumda da CreateEvent'in kullanılmasını önerdiğim neden (bir işlemde CreateEvent ve diğerinde OpenEvent ile karşılaştırıldığında), hangi işlemin ilk başladığının önemli olmadığı anlamına gelmesidir. Etkinliklerin paylaşıldığı gerçeği, devleti nasıl paylaştığınızdır. Olayları her zaman olduğu gibi niçin görüyorsun bilmiyorum. – torak
Bunu daha açıklayabilir misiniz? MSDN belgeleri yalnızca bir süreçte nasıl yapılacağını gösterme eğilimindedir, ikisi arasında değil, anlaşılması güçtür. –