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

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

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

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

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

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

Хочется найти возможность приостановить дочерние потоки без WinApi. Как такое сделать, не потеряв в производительности?
http://www.cyberforum.ru/cpp-beginners/thread2204674.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2013, 18:29
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как реализовать ожидание потоком без Win32? (C++):

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

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

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

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

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

12
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,045
Записей в блоге: 17
02.01.2013, 18:47 #2
http://www.cyberforum.ru/cpp-builder/thread618027.html


Нельзя для таких целей использовать переменную
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
, поэтому там устанавливается значение глобальной константы:
Кстати почему константы ?
0
Invader_Zim
Twilight Parasite
153 / 149 / 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
Каратель
Эксперт С++
6568 / 3989 / 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
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,045
Записей в блоге: 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
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,045
Записей в блоге: 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
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,045
Записей в блоге: 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
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,045
Записей в блоге: 17
02.01.2013, 20:43 #13
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
Ну так остальные потоки исходя из значения этой переменной принимают решение о преостановке.
Ну значит нужна синхронизация...

Не ту ссылку кинул http://www.cyberforum.ru/cpp-beginners/thread575727.html
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()....

Как сделать чтобы поток вызванный дочерним потоком не перебивался другими потоками?
При вызове несколько раз подряд возможен перебив другими потоками.Как бы...

Как можно было бы избавиться от вызова cin.Get() в каждой функции, работающей с потоком
Вообщем вот код: main: #include &quot;iostream&quot; #include &quot;map&quot; #include...


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

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

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