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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
TamTam
18 / 18 / 1
Регистрация: 28.12.2011
Сообщений: 176
#1

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

13.01.2012, 22:06. Просмотров 548. Ответов 5
Метки нет (Все метки)

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: (т.е. второй поток)
А уже потом просит ввести..
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2012, 22:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Потоки в винде. Работает, но криво (C++):

Функиця криво работает - C++
не могу понять в чем дело она не выводит весь текст.Нужно чтоб фунцкия два раза вывела фразу Three blind mice и потом еще два раза See now...

Rand в матрице работает криво. - C++
Делаю программу на заполнение матрицы случайными числами, к примеру . #include &lt;iostream&gt; using namespace std; int main() { ...

Криво работает удаление пробелов из строки - C++
Нашел в нете код #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;algorithm&gt; int main() { std::string s(&quot; Test Test...

криво работает коеструктор копии производного класса - C++
#include &lt;iostream&gt; using namespace std; #include &lt;conio.h&gt; class building { protected: int **A, level, flat; public: ...

Эксперты! Одномерный массив неповторяющихся чисел не могу понять почему криво работает - C++
Задание: Нужно вывести массив из случайных чисел. Размер массива 8. Случайные числа от 1 до 8. Числа не должны повторяться. #include...

Структура "Штраф". Функция поиска криво работает - C++
Не работает функция poisk(); Переписать в новый файл информацию о штрафах, размер которого и дата вводятся с клавиатуры. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vital792
1990 / 1262 / 57
Регистрация: 05.06.2010
Сообщений: 2,213
13.01.2012, 22:13 #2
Не понимаю, зачем в ЭТОЙ задаче потоки) Как пример работы с потоками? Не очень удачный пример надо сказать, ведь в том и смысл потоков, чтобы они работали параллельно. А в данной задаче, вывод должен быть именно после ввода - то есть последовательно. Т.е. либо убрать потоки, либо ввести задержку, либо я че то не правильно понял)
1
TamTam
18 / 18 / 1
Регистрация: 28.12.2011
Сообщений: 176
13.01.2012, 22:15  [ТС] #3
да, смысл - просто пример работы с патоками. Подскажите с задержкой пожалуйста.
0
vital792
1990 / 1262 / 57
Регистрация: 05.06.2010
Сообщений: 2,213
13.01.2012, 22:21 #4
Цитата Сообщение от TamTam Посмотреть сообщение
с задержкой
тупо sleep.
Можно еще ждать их по очереди WaitForSingleObject, но все это плохие способы, т.к. на мой взгляд пример неудачный. В нем потоки просто вообще не нужны)
1
TamTam
18 / 18 / 1
Регистрация: 28.12.2011
Сообщений: 176
14.01.2012, 02:21  [ТС] #5
окей, попробую, спасибо
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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;
}
С ними у меня всё нормально работало.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2012, 02:58
Привет! Вот еще темы с ответами:

Что такое потоки ввода, потоки вывода? - C++
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

с++ на 7 винде - C++
помогите определить в чем ошибка #include&quot;stdafx.h&quot; #include &lt;iostream&gt; #include&lt;math.h&gt; int main() {double r,h,e,v,s,l; cout ...

Исполнение команды в винде - C++
Кто-нибудь делал екзешник для винды, который запускает исполнение команды: java -jar SomeJarFile.jar Или любой другой. Как это...

Какая получится кодировка на винде? - C++
std::wofstream XML; XML.open(Name.c_str()); XML&lt;&lt;L&quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF\&quot;?&gt;&quot;&lt;&lt;std::endl; XML&lt;&lt;L&quot;&lt;root&gt;&quot;&lt;&lt;std::endl; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.01.2012, 02:58
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru