Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
1

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

02.01.2013, 18:29. Просмотров 607. Ответов 12
Метки нет (Все метки)

В одном решении у меня два проекта: типа "Приложение MFC" (интерфейс работы с юзером) и типа "Пустой проект" (для запуска рабочих потоков). Иногда из интерфейса юзера надо приостановить кипучую деятельность моих потоков, поэтому там устанавливается значение глобальной константы:

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

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

Хочется найти возможность приостановить дочерние потоки без WinApi. Как такое сделать, не потеряв в производительности?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2013, 18:29
Ответы с готовыми решениями:

Ожидание в функции без sleep()
Алоха! Надо сделать следующее: аргументы в функции должны каждую секунду менять...

Как реализовать загрузку файла без .net fraemwork ?
Есть инструмент который весит 5GB ,необходимо сделать загрузчик с прямой...

Как реализовать код без применения ассоциативного массива (map)?
Имеется такой код. Как можно его изменить, не использую массив map? #include...

Как реализовать открытие изображения формата jpeg без посторонних библиотек?
Народ может кто то уже реализовал, и сможет помочь советом или ссылкой. Мне...

Дана матрица N*N. Как реализовать перемещение по матрице без участия пользователя?
Дан двумерный массив 20*20 типа int, инициализированный(пустое место). На нем...

12
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,401
Записей в блоге: 17
02.01.2013, 18:47 2
Объекты синхронизации


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

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

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

Не по теме:

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

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

C++
1
while(Pause) Sleep(100);
0
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,401
Записей в блоге: 17
02.01.2013, 20:09 9
Нет, используйте WinApi, без него никак нормально не получится...

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

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

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

P.S. Читайте ссылку
0
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
02.01.2013, 20:37  [ТС] 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. Читайте ссылку
Ну так остальные потоки исходя из значения этой переменной принимают решение о преостановке.

Насчет ссылки: у меня нет проблем с синхронизацией значений. Поэтому ссылка "мимо кассы".
0
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,401
Записей в блоге: 17
02.01.2013, 20:43 13
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
Ну так остальные потоки исходя из значения этой переменной принимают решение о преостановке.
Ну значит нужна синхронизация...

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

Как правильно реализовать метод добавления и удаления объектов в хранилище без перегрузки?
Не знаю как правильно здесь реализовать метод добавления и удаления объектов в...

Как пользоваться потоком строк
Как stringstream-ом получить поток строк, а потом все их, не смешав, записать в...

Как открыть второй файл тем же потоком?
Создаю поток ifstream ifs и открываю файл A.txt, закрываю поток ifs.close()....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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