Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 01.12.2019, 11:30   #1
astero
Новичок
Джуниор
 
Регистрация: 17.04.2019
Сообщений: 3
По умолчанию etEvent вызывает каждый поток только раз

Добрый день.Никак не могу разобраться с синхронизацией потоков.
Делаю некую имитацию Round Robin.
Нужно чтоб, каждый поток отработал 3 раза и потом по новой ,но у у меня ситуация как в заголовке.

Пробовал один эвент для всех потоков,пробовал в цикле в майне вызывать каждый поток по своему эвенту,результат почти всегда один - если поток отработал,заново он уже не запускается.
Можно как то реализовать бесконечный вызов потоков в порядке очереди?
Код примерно такой.
Код:
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <string.h>
using namespace std;
DWORD dwThrId0, dwThrId1, dwThrId2;
HANDLE hTread0, hTread1, hTread2;
HANDLE hEv0, hEv1, hEv2;
CRITICAL_SECTION cs;
const int n = 3;
struct  Task {
	int  tQ, tQ0, tID;
	bool end = false;
}tasks[n];

DWORD WINAPI thr0(LPVOID lpParameter) {
	//EnterCriticalSection(&cs);
    WaitForSingleObject(hEv0, INFINITE);
		cout << " thread 0 "<<endl;
		Sleep(300);
		SetEvent(hEv1);
	//	LeaveCriticalSection(&cs);
	return 0;
}

DWORD WINAPI thr1(LPVOID lpParameter) {
	//EnterCriticalSection(&cs);
	WaitForSingleObject(hEv1, INFINITE);
	    cout << " thread 1 " << endl;
	    Sleep(300);
		SetEvent(hEv2);
	//LeaveCriticalSection(&cs);
		
	return 0;
}
DWORD WINAPI thr2(LPVOID lpParameter) {
	//EnterCriticalSection(&cs);
	WaitForSingleObject(hEv2, INFINITE);
		cout << " thread 2 "<<endl;
		Sleep(300);
		SetEvent(hEv0);
	//LeaveCriticalSection(&cs);
	return 0;
}

void main(){
	//InitializeCriticalSection(&cs);
	
    hEv0 = CreateEvent(NULL, false, false, NULL);
	hTread0 = CreateThread(NULL, 0, thr0, 0, 0, &dwThrId0);

	hEv1 = CreateEvent(NULL, false, false, NULL);
	hTread1 = CreateThread(NULL, 0, thr1, 0, 0, &dwThrId1);

	hEv2 = CreateEvent(NULL, false, false, NULL);
	hTread2 = CreateThread(NULL, 0, thr2, 0, 0, &dwThrId2);



	while (true) {

	SetEvent(hEv0);
	
		
	}
}
astero вне форума   Ответить с цитированием
Старый 01.12.2019, 13:26   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 5,970
По умолчанию

Таки каждый поток должен работать в цикле.
Зато while(true) в функции main не нужен, нужно вызвать только раз, чтоб запустить первый поток.
waleri вне форума   Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли создать SFX архив с несколькими файлами, при распаковке вводить пароль на определенный файл (на каждый файл свой пароль) и распаковывался только это файл? jeksembiev Windows 11 11.05.2017 16:28
В каждый момент на форме отображаются только два списка с именами и фамилиями Johny91 Помощь студентам 4 08.11.2013 14:44
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты ИльназВ C# (си шарп) 13 22.11.2012 19:00
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40