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

Как реализовать ожидание потоком без Win32? - C++

Восстановить пароль Регистрация
 
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
02.01.2013, 18:29     Как реализовать ожидание потоком без Win32? #1
В одном решении у меня два проекта: типа "Приложение MFC" (интерфейс работы с юзером) и типа "Пустой проект" (для запуска рабочих потоков). Иногда из интерфейса юзера надо приостановить кипучую деятельность моих потоков, поэтому там устанавливается значение глобальной константы:

C++
1
Pause = true;
, а потоки иногда анализирует это значение:

C++
1
if(Pause) WaitForSingleObject (hEventsToChild, INFINITE);
Так вот потоки реализованы в проекте типа "Пустой проект", где недоступны виндосовские "штучки". Сделано это специально чтобы минимизировать глобальный контекст и снизить вероятность ошибки (поскольку поток может крутиться неделями и вопрос надежности стоит на первом месте).

Хочется найти возможность приостановить дочерние потоки без WinApi. Как такое сделать, не потеряв в производительности?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
02.01.2013, 18:47     Как реализовать ожидание потоком без Win32? #2
Объекты синхронизации


Нельзя для таких целей использовать переменную
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
, поэтому там устанавливается значение глобальной константы:
Кстати почему константы ?
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
02.01.2013, 18:50     Как реализовать ожидание потоком без Win32? #3
Может нити помогут?
std::thread
std::mutex
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
02.01.2013, 19:09  [ТС]     Как реализовать ожидание потоком без Win32? #4
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати почему константы ?
Ошибка вышла, разумеется переменная.

Добавлено через 49 секунд
Цитата Сообщение от Invader_Zim Посмотреть сообщение
Может нити помогут?
std::thread
std::mutex
Потоки, нити- разные названия одного и того же.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.01.2013, 19:25     Как реализовать ожидание потоком без Win32? #5
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
Так вот потоки реализованы в проекте типа "Пустой проект", где недоступны виндосовские "штучки". Сделано это специально чтобы минимизировать глобальный контекст и снизить вероятность ошибки (поскольку поток может крутиться неделями и вопрос надежности стоит на первом месте).
что-то не вижу связи между типом проекта VS и надежностью

Добавлено через 28 секунд
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
в проекте типа "Пустой проект", где недоступны виндосовские "штучки"
прям таки недоступны
-=ЮрА=-
02.01.2013, 19:26
  #6

Не по теме:

Invader_Zim, надо дописать для C++0x

Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
02.01.2013, 19:35     Как реализовать ожидание потоком без Win32? #7
Пустой проект работать не будет ... ПолюбЭ надо подключать windows.h
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
02.01.2013, 20:07  [ТС]     Как реализовать ожидание потоком без Win32? #8
Цитата Сообщение от Avazart Посмотреть сообщение
Пустой проект работать не будет ... ПолюбЭ надо подключать windows.h
Ну может как-то можно усыпить поток без WinAPI? И тогда получится так (тока надо из интерфейсного потока изменить значение глобальной переменной Pause):

C++
1
while(Pause) Sleep(100);
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
02.01.2013, 20:09     Как реализовать ожидание потоком без Win32? #9
Нет, используйте WinApi, без него никак нормально не получится...

Я уже сказал, что к переменной обращаться из разных потоков (без синхронизации) нельзя.
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
02.01.2013, 20:27  [ТС]     Как реализовать ожидание потоком без Win32? #10
Цитата Сообщение от Avazart Посмотреть сообщение
Нет, используйте WinApi, без него никак нормально не получится...
В библиотеке С++ есть класс <thread> с функцией "sleep_for". Кто- нибудь пробовал усыплять библиотекой C++?

Цитата Сообщение от Avazart Посмотреть сообщение
Я уже сказал, что к переменной обращаться из разных потоков (без синхронизации) нельзя.
Переменная Pause на запись используется только в единственном потоке интерфейса. Остальные потоки ее только читают.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
02.01.2013, 20:33     Как реализовать ожидание потоком без Win32? #11
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
библиотеке С++ есть класс <thread> с функцией "sleep_for". Кто- нибудь пробовал усыплять библиотекой C++?
То обвертка над WinApi

Добавлено через 1 минуту
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
Переменная Pause на запись используется только в единственном потоке интерфейса. Остальные потоки ее только читают.
Ну так смысл от этой переменной если она используется только одним потоком ?

P.S. Читайте ссылку
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
02.01.2013, 20:37  [ТС]     Как реализовать ожидание потоком без Win32? #12
Нашел код с этой функцией:

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <chrono>
#include <thread>
 
int main()
{
    std::cout << "Hello waiter" << std::endl;
    std::chrono::milliseconds dura( 2000 );
    std::this_thread::sleep_for( dura );
    std::cout << "Waited 2000 ms\n";
}
А может быть можно как-то библиотеку WinAPI на недолго подключить? Типа для одной только строчки кода (при этом не хочется вы носить в отдельный файл вызов этой функции, чтобы там прописать заголовок)

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так смысл от этой переменной если она используется только одним потоком ?

P.S. Читайте ссылку
Ну так остальные потоки исходя из значения этой переменной принимают решение о преостановке.

Насчет ссылки: у меня нет проблем с синхронизацией значений. Поэтому ссылка "мимо кассы".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2013, 20:43     Как реализовать ожидание потоком без Win32?
Еще ссылки по теме:

Реализовать поиск без учёта регистра C++
Дана матрица N*N. Как реализовать перемещение по матрице без участия пользователя? C++
C++ Как реализовать открытие изображения формата jpeg без посторонних библиотек?

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
02.01.2013, 20:43     Как реализовать ожидание потоком без Win32? #13
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
Ну так остальные потоки исходя из значения этой переменной принимают решение о преостановке.
Ну значит нужна синхронизация...

Не ту ссылку кинул Нужно ли синхронизировать доступ к переменной из двух потоков?
Yandex
Объявления
02.01.2013, 20:43     Как реализовать ожидание потоком без Win32?
Ответ Создать тему
Опции темы

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