Шаг 339 - Глобальные переменные, потоки и volatile

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


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.