Tôi có một ứng dụng gồm hai cửa sổ, một giao tiếp với nhau và gửi cho nó cấu trúc có hai số nguyên (Trong trường hợp này là hai cuộn xúc xắc).Làm thế nào để gửi tín hiệu sự kiện thông qua quy trình - C
tôi sẽ sử dụng các sự kiện cho các trường hợp sau:
- Process một gửi dữ liệu để xử lý b, quá trình b hiển thị dữ liệu
- Process một đóng cửa, trong quá trình lần lượt đóng cửa b
- Process b đóng cửa a, lần lượt đóng quá trình a
Tôi đã nhận thấy rằng nếu quá trình thứ hai liên tục chờ quá trình đầu tiên gửi dữ liệu thì chương trình sẽ chỉ ngồi chờ đợi, ich là nơi mà ý tưởng thực hiện các luồng trên mỗi tiến trình đã xảy ra và tôi đã bắt đầu thực hiện điều này.
Vấn đề tôi gặp phải là tôi không có nhiều kinh nghiệm về chủ đề và sự kiện nên tôi không chắc chắn cách tốt nhất để thực sự triển khai những gì tôi muốn làm.
Tôi đang cố gắng tìm hiểu xem quy trình khác sẽ biết về sự kiện được kích hoạt như thế nào để có thể thực hiện các tác vụ cần thực hiện, tôi không hiểu cách một quy trình tách biệt với một quy trình khác nêu rõ các sự kiện đặc biệt vì nó cần hành động ngay khi sự kiện đã thay đổi trạng thái.
Nhờ sự giúp đỡ
Edit:
Tôi chỉ có thể sử dụng Create/Set/phương pháp mở cho các sự kiện, xin lỗi vì đã không nhắc đến nó trước đó.
Hơn nữa, tôi tạo luồng mới trong tiến trình A cho phép người dùng tương tác với ứng dụng trong khi nghe sự kiện đóng.
Tạo chủ đề:
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);
}
khai mạc sự kiện trên A khi B đóng:
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;
}
}
}
Tạo sự kiện trong b (Trong WM_CREATE):
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);
}
Thiết sự kiện để báo hiệu khi B đóng:
case WM_DESTROY:
{
SetEvent(hConsumerCloseEvent);
PostQuitMessage(0);
break;
}
Như bạn có thể nhìn thấy khi sự kiện được báo hiệu, ứng dụng A được thiết lập để đóng. Khi tôi chạy cả hai ứng dụng và quá trình đóng B, tiến trình A không nhận thấy tín hiệu đã thay đổi và không đóng.
Chỉnh sửa 2:
Sau khi sử dụng các GetLastError(); Tôi đã có thể để xác định rằng tay cầm vào OpenEvent là NULL, sai số nhất định là
ERROR_FILE_NOT_FOUND - 2: Hệ thống không thể tìm thấy các tập tin định
là phương pháp của tôi tạo ra sự kiện và đọc nó không chính xác, tôi đã đảm bảo bao gồm tiền tố Global \.
Tôi không hiểu tại sao bạn có các tập hợp sự kiện trùng lặp cho từng mẫu bạn đã cung cấp, cũng như thế nào mỗi quy trình có thể nói rằng người kia đã thay đổi trạng thái ?. Vì một lý do nào đó mặc dù tôi đã đặt sự kiện thành sai, chương trình vẫn thấy nó được báo hiệu ngay lập tức, nó không có ý nghĩa gì cả. –
Thực sự là một bộ gồm hai sự kiện. Lưu ý rằng các tên giống nhau, tiến trình đầu tiên để chạy sẽ tạo ra chúng, cái thứ hai sẽ xử lý các sự kiện đã tồn tại trước đó. Lý do tôi đề nghị sử dụng CreateEvent trong cả hai trường hợp (so với CreateEvent trong một quy trình, và OpenEvent trong một quy trình khác) là nó có nghĩa là không quan trọng bạn bắt đầu quy trình nào trước tiên. Thực tế là các sự kiện được chia sẻ là cách bạn chia sẻ trạng thái. Tôi không biết tại sao bạn lại thấy các sự kiện như luôn được báo hiệu. – torak
Bạn có thể giải thích nó đơn giản hơn không? Các tài liệu MSDN chỉ có xu hướng để hiển thị như thế nào để làm điều đó trong một quá trình, không phải giữa hai vì vậy rất khó hiểu. –