C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 339 - Глобальные переменные, потоки и volatile / MFC шаг за шагом / Visual C++

Шаг 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.


| |
Автор Каев Артем.
[AD]