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

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

Войти
Регистрация
Восстановить пароль
 
IvanPryamoy
247 / 1 / 1
Регистрация: 02.01.2013
Сообщений: 31
#1

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

02.01.2013, 18:29. Просмотров 586. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как реализовать ожидание потоком без Win32? (C++):

Как реализовать загрузку файла без .net fraemwork ? - C++
Есть инструмент который весит 5GB ,необходимо сделать загрузчик с прямой ссылки (Имеется ввиду www.domain...123.exe) Главная проблема...

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

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

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

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

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

12
Avazart
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,600
Записей в блоге: 17
02.01.2013, 18:47 #2
Объекты синхронизации


Нельзя для таких целей использовать переменную
Цитата Сообщение от IvanPryamoy Посмотреть сообщение
, поэтому там устанавливается значение глобальной константы:
Кстати почему константы ?
0
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 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
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 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
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,600
Записей в блоге: 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
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,600
Записей в блоге: 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
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,600
Записей в блоге: 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
Эксперт С++
7421 / 5511 / 316
Регистрация: 10.12.2010
Сообщений: 24,600
Записей в блоге: 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
Привет! Вот еще темы с ответами:

Как открыть второй файл тем же потоком? - C++
Создаю поток ifstream ifs и открываю файл A.txt, закрываю поток ifs.close(). Попытка открыть второй файл ifs.open(&quot;B.txt&quot;) заканчивается...

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

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

Реализовать поиск без учёта регистра - C++
Здравствуйте, возникла проблема, нужно сделать поиск строки в текстовом файле без учёта регистра. Желательно использовать .find (ищет с...


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

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

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