Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с потоками через winAPI

590
30 октября 2006 года
Gigahard
223 / / 03.04.2006
Недавно стал изучать потоки в винде, возникла небольшая проблемка.
Вот собственно код:

Код:
#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;
}


В консоли сначала создаем поток с некоторым зацикленым кодом. Для примера сделал простой текстовый вывод в цикле. После остановки этого потока, управление не передается основной программе. Однако если код функции потока как либо загрузить по времени, к примеру добавить Sleep(), то тогда поток приостанавливается и передает управление программе. Почему так происходит?
8.7K
30 октября 2006 года
Rubicon
55 / / 28.10.2005
[QUOTE=Gigahard]Почему так происходит?[/QUOTE]
После ResumeThread(Thread) начинает работать "печатающий" поток.
Sleep() на указанное количество милисекунд останавливает поток, в котором он был вызван (в частности, созданный поток) и управление передается Windows-ом основному потоку программы, т.е. срабатывает getch().
590
30 октября 2006 года
Gigahard
223 / / 03.04.2006
Что происходит при Sleep() я понимаю, собственно для наглядности и добавил. Меня больше интересует, что происходит при отсутствии sleep().
После ResumeThread() первый getch() прекрасно срабатывает и в отсутствии sleep(). Вся бяка в том, что после выполнения SuspendThread() поток останавливается, но управление программе не передается. Т.е. второй getch() не обрабатывается.
547
31 октября 2006 года
Hydra
488 / / 20.06.2006
У созанного потока нет своей консоли для вывода в нее. Скорее всего поток процесса надо соединить с созданным через AttachThreadInput для синхронизации ввода/вывода.
8.7K
31 октября 2006 года
Rubicon
55 / / 28.10.2005
мне 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% ресурсов компа....)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог