#c #multithreading #visual-studio
#c #многопоточность #visual-studio
Вопрос:
Новичок во встроенных системах здесь. Мне нужно синхронизировать два потока с событиями. Мой код показывает только "Show in edit box 2sec"
и не собирается secondthread
показывать, что у меня там есть. Я должен показывать в окне редактирования в течение 2 секунд с одним потоком сообщение, а через две секунды я должен показывать в течение 3 секунд другое сообщение. Это должно повторяться вечно.
void FirstThread(void)
{
int i;
//write data to edit box
CString szEdit;
szEdit.Format(_T("Show in edit box 2sec"));
m_editbox->SetWindowText(szEdit);
while(1){
WaitForSingleObject (hEvent, INFINITE);
for(i=0;i<1;i ){
Sleep(2000);
}
SetEvent (hEvent);
}
}
void SecondThread (void)
{
int i;
//write data to edit box
CString szEdit;
szEdit.Format(_T("Show in edit box 3 sec"));
m_editbox->SetWindowText(szEdit);
while(1){
WaitForSingleObject (hEvent, INFINITE);
for(i=0;i<1;i ){
Sleep(3000);
}
SetEvent (hEvent);
}
}
Комментарии:
1. Безопасно ли устанавливать пользовательский интерфейс, например
m_editbox
, из двух разных потоков?
Ответ №1:
Вы должны использовать два разных события, одно из которых сигнализирует об окончании режима ожидания в первом потоке, другое — во втором потоке. (Первоначально одно из этих событий должно быть установлено (сигнализировано), другое — сброшено.)
Ответ №2:
С вашим подходом есть проблемы. MFC не позволит вам получить доступ к элементу управления из потока, который его не создавал, а размещение WaitForSingleObject или Sleep в основном потоке останавливает обработку сообщений, поэтому программа становится «невосприимчивой».
Вы могли бы сделать это без потоков, без WaitForSingleObject, без сна и без событий, используя таймер в основном потоке. Основной поток сначала вызовет SetTimer, а затем обработает сообщение WM_TIMER для периодического изменения управляющего текста. Между тем, программа сможет обрабатывать любые другие сообщения в обычном режиме, между сообщениями WM_TIMER.