Показать полную графическую версию : Вопрос по WinAPI
SeRgikON
02-06-2011, 23:44
Вопрос по синхронизации процессов\потоков. Есть программа, в ней два потока. В одном ввод символа, в другом выводится "*" если мы ввели цифру (в случае ввода символа ничего не выводится, и нужно повторить ввод). Как сделать чтобы программа принимала значение (цифру или символ) и сразу запускался второй поток, выводящий "*"? (сейчас ввод данных производится после нажатия Enter'a). Подскажите через что можно реализовать.
всмысле через что можно реализовать? например в с# мона использовать System.Threading; оно имеет класс потока - Thread.
как я понимаю ты это делаешь в консоле - поэтому у тебя и затык с энтером. ты небось с консоли пытаешься получить строку что в корне неверно тебе нужно получать посимвольно. тогда энтер в конце не требуется.
crashtuak
04-06-2011, 11:46
SeRgikON, вы имеете в виду потоки ввода/вывода? Если да, то просто можно с одного потока (вводящего символ) считать символ, проверить, цифра ли, если истина, вывести во втором потоке *. Если у вас разные нити приложения, в которых ваша программа исполняется, тогда тут нужно немного по другому...(немного не понятно про какие потоки идет речь, в Java, на пример, потоки ввода-вывода называются Stream, а нити приложения-Thread).
crashtuak,
да собственно говоря в "с" подобных языках также - потоки ввода/вывода: базовый класс - Stream, многозадачность - Thread
crashtuak
05-06-2011, 16:20
Beyound, та я то знаю(от вас:)), просто SeRgikON не написал про какие именно потоки идет речь:)
SeRgikON
06-06-2011, 14:25
crashtuak, потоки всмысле "нитей" приложения. и если можно поподробней, про "немного по другому" :)
код:
using namespace std;
BOOL g_hMutex=FALSE;
DWORD WINAPI Thread1(void *arg) //функция принимающая пустой аргумент-указатель
{ setlocale (LC_ALL,"russian");
char str[2]; int grade=0;
cout<<endl<<"Ввод:";
while(grade==0)
{ cin >> str;
grade=atoi(str);
if (grade==0) cout<<"Не число!\nВвод:";
}
g_hMutex=TRUE;
return NULL; }
DWORD WINAPI Thread2(void *arg)
{ cout<<"Вывод:"<<'*';
Sleep(100);
g_hMutex=FALSE;
return NULL; }
int main() {
DWORD idThread1;
HANDLE hThread1;
DWORD idThread2;
HANDLE hThread2;
while(1) {
hThread1=CreateThread(NULL,0,Thread1,NULL,0,&idThread1);
WaitForSingleObject(hThread1,INFINITE);
if(g_hMutex==TRUE)
{ hThread2=CreateThread(NULL,0,Thread2,NULL,0,&idThread2);
Sleep(100); }
else {
system("pause");
TerminateThread(hThread1,0); //завершение потоков
TerminateThread(hThread2,0);
return 0;
} } }
crashtuak
07-06-2011, 00:10
1) Инклудим conio.h
2) Используем функцию _getch(). Возвращает int(код введенного символа '0'=48..'9'=57).
3) Проверяем введенный символ на принадлежность к числам, вызываем поток для печати "*".
Пример кода:
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
int n;
do
{
n = _getch();
} while( n != 'C' );
return 0;
}
Далее по вашему коду: зачем данные действия разносить в разные потоки? TerminateThread(hThread1,0); помоему не имеет смысла, так как есть WaitForSingleObject(hThread1,INFINITE); которая(если не ошибаюсь) дожидается завершения потока...
SeRgikON
07-06-2011, 19:40
как-то у меня вообще ничего не вводится через _getch()...
ну такое задание, в одном потоке ввод, а в другом вывод
crashtuak
07-06-2011, 22:19
Понятно... А Пример кода: » работает?
У меня почему то с сложными условиями в цикле не работало, пришлось сделать контрольную переменную типа bool, и в теле цикла пробегая по swicth устанавливать контрольную переменную в нужное состояние...
SeRgikON
07-06-2011, 22:58
пример не работает, ничего не вводится
crashtuak
08-06-2011, 16:16
SeRgikON, там и ниче не должно выводится:) Просто в дебагере нужно посмотреть равно ли n=0 если нет, значит все работает:)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.