синхронизация потоков с событиями

#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.