#include <vcl.h>
#include <stdio>
#include <conio>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
DWORD WINAPI ThreadProc(LPVOID Param)
{
while(true)
{
printf("Starting thread...\n");
Sleep(1); //Если закоментить эту строку, то при остановке потока, программа виснет
}
return 0;
}
int main(int argc, char* argv[])
{
HANDLE Thread;
DWORD ThreadId;
Thread= CreateThread(0,0,ThreadProc,NULL,CREATE_SUSPENDED,&ThreadId);
ResumeThread(Thread);
getch();
SuspendThread(Thread);
printf("Stopped...");
getch();
return 0;
}
Работа с потоками через winAPI
Вот собственно код:
Код:
В консоли сначала создаем поток с некоторым зацикленым кодом. Для примера сделал простой текстовый вывод в цикле. После остановки этого потока, управление не передается основной программе. Однако если код функции потока как либо загрузить по времени, к примеру добавить Sleep(), то тогда поток приостанавливается и передает управление программе. Почему так происходит?
После ResumeThread(Thread) начинает работать "печатающий" поток.
Sleep() на указанное количество милисекунд останавливает поток, в котором он был вызван (в частности, созданный поток) и управление передается Windows-ом основному потоку программы, т.е. срабатывает getch().
После ResumeThread() первый getch() прекрасно срабатывает и в отсутствии sleep(). Вся бяка в том, что после выполнения SuspendThread() поток останавливается, но управление программе не передается. Т.е. второй getch() не обрабатывается.
У созанного потока нет своей консоли для вывода в нее. Скорее всего поток процесса надо соединить с созданным через AttachThreadInput для синхронизации ввода/вывода.
не претендую на 100% справедливость, но...
"Вся бяка в том, что после выполнения SuspendThread() поток останавливается, но управление программе не передается" --- именно так, поток останавливает выполнение кода, но не более:"Suspending a thread causes the thread to stop executing user-mode (application) code.
". Похоже тут действительно проблема в синхронизации доступа к консоли вывода, а без sleep-а поток не "отпускает" консоль и основной поток не может туда вывести. А на счет sleep-а и первого getch --- может дело в том, что getch работает несколько иначе, чем printf --- getch ждет ввода кюча (нажатия клавишы),вывод в консоль ему вовсе не обязателен, а printf требует консоли вывода (output stream), поэтому и не может сработать... (если к примеру в место первого getch поставить printf, то он тоже не сработает --- только не надо пробовать проверять в режиме отладки --- при этом потоки не так, как в реальном времени---про это подробно в хелпе написано).
Короче, мой вывод --- sleep необходим (к тому же без него эта простенькая програмулинка жрет 30% ресурсов компа....)