Один из методов взаимодействия потоков является использование глобальных переменных. Давайте изменим код предыдущего шага. В файле 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.