Форум программистов, компьютерный форум CyberForum.ru

Потоки в винде. Работает, но криво - C++

Восстановить пароль Регистрация
 
TamTam
18 / 18 / 1
Регистрация: 28.12.2011
Сообщений: 176
13.01.2012, 22:06     Потоки в винде. Работает, но криво #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string.h>
using namespace std;
 
 
HANDLE hMutex;  //объявляем мьютекс
char buf[256];
 
//функция, записывающая данные в буфер
DWORD WINAPI ThreadFuncWrite(LPVOID lpParam)
{
    WaitForSingleObject(hMutex,INFINITE);   //захватить мьютекс
 
    cout<<"Vvedite text: ";
    cin.getline(buf,256);
 
    ReleaseMutex(hMutex);   //освободить мьютекс
    return 0;
}
 
//функция, считывающая данные из буфера
DWORD WINAPI ThreadFuncRead(LPVOID lpParam)
{
    WaitForSingleObject(hMutex,INFINITE);   //захватить мьютекс
 
    cout<<"Vvedeno:" <<buf<<"\n";
 
    ReleaseMutex(hMutex);   //освободить мьютекс
    return 0;
}
 
int main()
{
    hMutex=CreateMutex(NULL,false,NULL);    //создаём мьютекс
 
    //создаём два потока
    HANDLE hThread=CreateThread(NULL,0,ThreadFuncWrite,NULL,0,NULL);
    HANDLE hThread2=CreateThread(NULL,0,ThreadFuncRead,NULL,0,NULL);
 
    HANDLE hThreadMas[2];
    hThreadMas[0]=hThread;
    hThreadMas[1]=hThread2;
 
    //завершение потоков
    WaitForMultipleObjects(2,hThreadMas,true,INFINITE);
    CloseHandle(hThread);
    CloseHandle(hThread2);
 
    getch();
    return 0;
}
Программа рабочая. Косяк в том, что иногда сначала вылазит: Vvedeno: (т.е. второй поток)
А уже потом просит ввести..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2012, 22:06     Потоки в винде. Работает, но криво
Посмотрите здесь:

Исполнение команды в винде C++
C++ с++ на 7 винде
C++ Rand в матрице работает криво.
C++ криво работает коеструктор копии производного класса
C++ Криво работает удаление пробелов из строки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vital792
1987 / 1259 / 57
Регистрация: 05.06.2010
Сообщений: 2,213
13.01.2012, 22:13     Потоки в винде. Работает, но криво #2
Не понимаю, зачем в ЭТОЙ задаче потоки) Как пример работы с потоками? Не очень удачный пример надо сказать, ведь в том и смысл потоков, чтобы они работали параллельно. А в данной задаче, вывод должен быть именно после ввода - то есть последовательно. Т.е. либо убрать потоки, либо ввести задержку, либо я че то не правильно понял)
TamTam
18 / 18 / 1
Регистрация: 28.12.2011
Сообщений: 176
13.01.2012, 22:15  [ТС]     Потоки в винде. Работает, но криво #3
да, смысл - просто пример работы с патоками. Подскажите с задержкой пожалуйста.
vital792
1987 / 1259 / 57
Регистрация: 05.06.2010
Сообщений: 2,213
13.01.2012, 22:21     Потоки в винде. Работает, но криво #4
Цитата Сообщение от TamTam Посмотреть сообщение
с задержкой
тупо sleep.
Можно еще ждать их по очереди WaitForSingleObject, но все это плохие способы, т.к. на мой взгляд пример неудачный. В нем потоки просто вообще не нужны)
TamTam
18 / 18 / 1
Регистрация: 28.12.2011
Сообщений: 176
14.01.2012, 02:21  [ТС]     Потоки в винде. Работает, но криво #5
окей, попробую, спасибо
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
14.01.2012, 02:58     Потоки в винде. Работает, но криво #6
TamTam, я когда делал лабораторные тоже с этим столкнулся, секрет в том что это происходит не всегда, а только первый раз, если закрыть и снова запустить программу то будет работать как положено
Хотя я тогда с семафорами лабораторную сдавал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <string>
#include <windows.h>
#include <process.h>
using namespace std;
 
string someString;
HANDLE m_hSemaphore; // Семафор для учета элементов очереди
 
unsigned __stdcall ReadFunc( void * arg)
{
    WaitForSingleObject(m_hSemaphore,INFINITE);
        cout<<"\nЯ тред 1 и я запустился потому что тред 2 изменил значение семафора.\nЗначение что было введено в треде 2:"<<someString<<"\n";
}
 
unsigned __stdcall WriteFunc( void * arg)
{
    cout<<"Я тред 2, введите какой-то текст:";
    cin>>someString;
    ReleaseSemaphore(m_hSemaphore,1, NULL); // Увеличиваем счетчик семафора на 1.
}
 
 
int main()
{
     SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    m_hSemaphore = CreateSemaphore(NULL, 0, 1000, NULL);    //начальное значение счетчика = 0
    unsigned uThreadIDs[2];
    HANDLE hThreads[2];
    hThreads[0] = (HANDLE)_beginthreadex( NULL, 0, &ReadFunc, NULL, 0,&uThreadIDs[0]);
    hThreads[1] = (HANDLE)_beginthreadex( NULL, 0, &WriteFunc, NULL, 0,&uThreadIDs[1]);
 
    WaitForMultipleObjects(2, hThreads, TRUE, INFINITE ); // без тайм-аута
    CloseHandle( m_hSemaphore);
    CloseHandle( hThreads[0] );
    CloseHandle( hThreads[1] );
    return 0;
}
С ними у меня всё нормально работало.
Yandex
Объявления
14.01.2012, 02:58     Потоки в винде. Работает, но криво
Ответ Создать тему
Опции темы

Текущее время: 19:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru