Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2010, 18:00   #1
vandrouny
Пользователь
 
Регистрация: 23.04.2009
Сообщений: 42
По умолчанию Управление потоками

Доброго дня! Разбираюсь с управлением потоков. Решил сделать консольную прогу, которая на нажатие "1" приостанавливает поток, на "2" - возобновляет. Но почему-то на нажатие 1 и 2 он вообще не реагирует. Что не так?
Код:
#include "stdafx.h"
#include "windows.h"
#include <iostream>



DWORD WINAPI second(LPVOID lpParameter)
{
	while(true)
	{
	std::cout << rand()%100;
	Sleep(2000);
	}
	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	DWORD ThreadID;
	HANDLE mythread=CreateThread(NULL,1024,second,NULL,0,&ThreadID);
    int choise;

	std::cin >> choise;

	switch (choise) {
	case 1: SuspendThread(mythread); break;
	case 2: ResumeThread(mythread); break;
	}


	WaitForSingleObject(mythread,-1);
	return 0;
}
vandrouny вне форума Ответить с цитированием
Старый 10.10.2010, 18:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А так:
Код:
#include "stdafx.h"
#include "windows.h"
#include <iostream>



DWORD WINAPI second(LPVOID lpParameter)
{
    while(true)
    {
    std::cout << rand()%100<<'\n';
    Sleep(2000);
    }
    return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
    DWORD ThreadID;
    HANDLE mythread=CreateThread(NULL,1024,second,NULL,0,&ThreadID);
    int choise;
    while(true){
        std::cin >> choise;
        switch (choise) {
            case 1: SuspendThread(mythread); break;
            case 2: ResumeThread(mythread); break;
            case 0: { TerminateThread(mythread,0);return 0;};
        }
    }
    return 0;
}
Смысл понял? Главный поток то тоже зациклить нужно, а не заморозить его на ожидание отработки доппотока.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.10.2010, 18:37   #3
vandrouny
Пользователь
 
Регистрация: 23.04.2009
Сообщений: 42
По умолчанию

Исправил, но всё равно не работает(

Как я понял, проблема в std::cin >> choise; . Он почему то не считывает choise

Последний раз редактировалось vandrouny; 10.10.2010 в 18:53.
vandrouny вне форума Ответить с цитированием
Старый 10.10.2010, 19:11   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Исправил, но всё равно не работает(
VS2010 - проверено. Работает хорошо. Все нажатия реагируют.

P.S. Кстати, может ты этого и не знаешь но std::cin >> choise; предполагает что после ввода ты жмакнешь клавишу Энтер...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.10.2010, 19:16   #5
vandrouny
Пользователь
 
Регистрация: 23.04.2009
Сообщений: 42
По умолчанию

Ах вот оно что, Enter! Блин, вот я лоханулся)))
Спасибо большое)
vandrouny вне форума Ответить с цитированием
Старый 17.12.2010, 15:10   #6
Zhigool'
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 29
По умолчанию

Здравствуйте, Товарищи!
Я новичок в winapi и в программировании в целом. Но полазив по сети вычитал, что использование TerminateThread не самая лучшая идея. А как можно сделать так чтобы сначала завершился mythread, а потом и основной процесс в данном примере?
Zhigool' вне форума Ответить с цитированием
Старый 17.12.2010, 15:34   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А как можно сделать так чтобы сначала завершился mythread, а потом и основной процесс в данном примере?
А разве данный пример так не поступает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.12.2010, 15:41   #8
Zhigool'
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 29
По умолчанию

Как в поток передать какую-либо переменную?

Последний раз редактировалось Zhigool'; 17.12.2010 в 17:09.
Zhigool' вне форума Ответить с цитированием
Старый 30.12.2010, 20:48   #9
DinoAsm
Пользователь
 
Аватар для DinoAsm
 
Регистрация: 29.10.2010
Сообщений: 31
Сообщение

Цитата:
Сообщение от Zhigool' Посмотреть сообщение
Как в поток передать какую-либо переменную?
Не знаю, как на си, но на асме всегда все глобальные переменные программы были доступны одновременно всем её потокам. Скорей всего на си так же.
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
DinoAsm вне форума Ответить с цитированием
Старый 31.12.2010, 19:42   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

глобальная переменная и переменная потока разные вещи.(уже второе замечание подобного рода)

а вообще внимательно читаем описание функции CreateThread.(там параметр который передается функции потока)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с потоками session Общие вопросы C/C++ 6 21.06.2010 17:13
Апплеты. управление потоками. (Java) Apteca Помощь студентам 0 30.05.2010 22:14
Работа с потоками Neymexa Общие вопросы .NET 16 23.04.2009 17:42
работа с потоками Alex_Pro Общие вопросы .NET 1 01.07.2008 07:25
Управление потоками. Запуск, остановка, приоритет потока. metamfetamin Помощь студентам 5 11.11.2007 12:45