Один из методов взаимодействия потоков является использование глобальных переменных. Давайте изменим код предыдущего шага. В файле TestThreadDlg.cpp объявим переменную.
static char THIS_FILE[] = __FILE__; #endif int test;
И поменяем код:
UINT Threads(LPVOID pParam)
{
test=2;
return 0;
}
void CTestThreadDlg::OnStart()
{
// TODO: Add your control notification handler code here
test=1;
AfxBeginThread(Threads,NULL);
Sleep(100);
if (test==2) AfxMessageBox("Hello 2");
}
Все сработает. Новый поток установит переменную. Отсюда вывод, используя глобальные переменные можно передавать и получать информацию от потока. Только объявить ее лучше с ключевым словом volatile. Почему ? Создавая версию Release эту переменную компилятор может поместить скажем в регистр. Он якобы оптимизирует по скорости работы с ней. А для нас это будет проблема.
Слово volatile говорит о том, что мы будем использовать эту переменную разными потоками и требует от компилятора не размещать ее для хранения там, где мы не сможем получить к ней доступ. Ее мы будем менять откуда угодно и мешать нам в этом не надо :-). Поэтому правильное объявление этой переменной будет такое.
volatile int test;
Давайте посмотрим как с помошью глобальной переменной можно остановить поток. Добавьте еще одну кнопку на диалоговое окно с именем Stop. И функцию обработки нажатия на нее. Смотрим код:
UINT Threads(LPVOID pParam)
{
while (test==1) ;
AfxMessageBox("Cancel Thread");
return 0;
}
void CTestThreadDlg::OnStart()
{
// TODO: Add your control notification handler code here
test=1;
AfxBeginThread(Threads,NULL);
}
void CTestThreadDlg::OnStop()
{
test=2;
}
Так вот процесс будет выполняться пока мы не нажмем на кнопку Stop. Запускайте кнопкой Start и процесс будет выполняться пока не нажмете Stop.