Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Вопрос по WinAPI (http://forum.oszone.net/showthread.php?t=208121)

SeRgikON 02-06-2011 23:44 1687425

Вопрос по WinAPI
 
Вопрос по синхронизации процессов\потоков. Есть программа, в ней два потока. В одном ввод символа, в другом выводится "*" если мы ввели цифру (в случае ввода символа ничего не выводится, и нужно повторить ввод). Как сделать чтобы программа принимала значение (цифру или символ) и сразу запускался второй поток, выводящий "*"? (сейчас ввод данных производится после нажатия Enter'a). Подскажите через что можно реализовать.

Beyound 04-06-2011 09:19 1688198

всмысле через что можно реализовать? например в с# мона использовать System.Threading; оно имеет класс потока - Thread.
как я понимаю ты это делаешь в консоле - поэтому у тебя и затык с энтером. ты небось с консоли пытаешься получить строку что в корне неверно тебе нужно получать посимвольно. тогда энтер в конце не требуется.

crashtuak 04-06-2011 11:46 1688249

SeRgikON, вы имеете в виду потоки ввода/вывода? Если да, то просто можно с одного потока (вводящего символ) считать символ, проверить, цифра ли, если истина, вывести во втором потоке *. Если у вас разные нити приложения, в которых ваша программа исполняется, тогда тут нужно немного по другому...(немного не понятно про какие потоки идет речь, в Java, на пример, потоки ввода-вывода называются Stream, а нити приложения-Thread).

Beyound 04-06-2011 15:57 1688347

crashtuak,
да собственно говоря в "с" подобных языках также - потоки ввода/вывода: базовый класс - Stream, многозадачность - Thread

crashtuak 05-06-2011 16:20 1688816

Beyound, та я то знаю(от вас:)), просто SeRgikON не написал про какие именно потоки идет речь:)

SeRgikON 06-06-2011 14:25 1689297

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 1689659

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 1690192

как-то у меня вообще ничего не вводится через _getch()...
ну такое задание, в одном потоке ввод, а в другом вывод

crashtuak 07-06-2011 22:19 1690274

Понятно... А
Цитата:

Цитата crashtuak
Пример кода: »

работает?

У меня почему то с сложными условиями в цикле не работало, пришлось сделать контрольную переменную типа bool, и в теле цикла пробегая по swicth устанавливать контрольную переменную в нужное состояние...

SeRgikON 07-06-2011 22:58 1690297

пример не работает, ничего не вводится

crashtuak 08-06-2011 16:16 1690783

SeRgikON, там и ниче не должно выводится:) Просто в дебагере нужно посмотреть равно ли n=0 если нет, значит все работает:)


Время: 17:14.

Время: 17:14.
© OSzone.net 2001-