2013-12-16 4 views
0

У меня есть две функции, мне нужно запустить оба из них параллельно, поэтому я создал поток для них в основной функции. код показан ниже:Шаги для выполнения потоков в win32

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
...... 

    _beginthread(ModbusRead,0,(void*)12); 
    _beginthread(ModbusWrite,0,(void*)10); 
} 

Две функции - ModbusRead и ModbusWrite.

Я реализовал только эти две строки потока в моем коде, и они запускают эти две функции параллельно друг от друга, кроме основного потока основной функции.

скажем, функция ModbusRead находится в thread1, а ModbusWrite - в thread2. Я должен сделать следующее.

function ModbusWrite(thread2) 
{ 
    if (condition1 true) 
    { 
     Pause thread1(donot run function ModbusRead) 

     if(condition2 true) 
       { 
        resume thread1(restart function ModbusRead) 
       } 
    } 
} 

Поскольку я новичок в нить я брожу правильно ли моя реализацию нити или нет, и как я могу выполнить упомянутое выше условие.

+0

Похоже, вы хотите взаимного исключения или событий или сигналов какого-то рода. Межпоточная коммуникация, как это, является довольно сложной проблемой и, вероятно, не является чем-то, что может быть адекватно объяснено в этом контексте, поскольку она требует тщательного проектирования, чтобы избежать взаимоблокировок и других проблем. Вы можете попробовать обратиться к документации MSDN по синхронизации: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686353(v=vs.85).aspx –

+0

. Это тот же вопрос, что и [ваш другой] (http://stackoverflow.com/questions/20603507/what-is-the-correct-synchronization-method-for-the-thread-in-win32)? – chwarr

+0

да что-то подобное .. просто пытаюсь по-другому, и я не могу вставить код, поэтому я создал еще один вопрос с более подробной информацией – user3048644

ответ

0

Thread1 должен быть циклом, который каждый раз проверяет событие через его цикл. Когда событие не установлено, поток приостанавливается в WaitForSingleObject.

while (WAIT_OBJECT_0 == WaitForSingleObject(hEvent, INFINITE)) 
{ 
    ...do some thread work 
} 

Другие потоки используют CreateEvent первоначально, затем SetEvent или ResetEvent возобновить/приостановить thread1. Нить не будет приостанавливаться немедленно: только когда его цикл вернется в WaitForSingleObject.

На практике вам, вероятно, также понадобится способ сигнализировать поток, когда он должен выйти. Это можно сделать, используя WaitForMultipleObjects, с одним событием для возобновления/паузы и вторым событием для выхода.

Смежные вопросы