Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как связать потоковую функцию с таймером / 25 сообщений из 62, страница 1 из 3
03.07.2013, 13:26
    #38318609
satch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Пишу в VS 2010 на C++, MFC'шное dialog-based-приложение. Задача такая: по нажатию на кнопку создать 2 дополнительных потока (AfxBeginThread), и чтобы каждый поток, точнее функция потока, выполнялись по таймеру (SetTimer). Потоки то создаются, их функции работают, а как их заставить выполняться по таймерам?
...
Рейтинг: 0 / 0
03.07.2013, 13:40
    #38318641
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
satch,

- создай Event ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396(v=vs.85).aspx)
- блокируйся в потоках на созданном событии ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx)
- при срабатывании таймера устанавливай состояние таймера - это приведет с разблокировке потоков ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms686211(v=vs.85).aspx)
...
Рейтинг: 0 / 0
03.07.2013, 14:10
    #38318726
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
satchЗадача такая: по нажатию на кнопку создать 2 дополнительных потока
(AfxBeginThread), и чтобы каждый поток, точнее функция потока, выполнялись по таймеру
(SetTimer).
Какая-то внутренне противоречивая задача... Поток обычно создаётся чтобы работать. Надо по
таймеру - порождай поток в процедуре таймера (или по приходу WM_TIMER). Заранее порождать
потоки ни к чему.
Или, если потоки созданы сразу, то ни к чему уже таймер: они сами могут уснуть на нужное
время, а потом проснуться без всякого внешнего воздействия.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2013, 15:07
    #38318895
satch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Dimitry SibiryakovsatchЗадача такая: по нажатию на кнопку создать 2 дополнительных потока
(AfxBeginThread), и чтобы каждый поток, точнее функция потока, выполнялись по таймеру
(SetTimer).
Какая-то внутренне противоречивая задача... Поток обычно создаётся чтобы работать. Надо по
таймеру - порождай поток в процедуре таймера (или по приходу WM_TIMER). Заранее порождать
потоки ни к чему.
Или, если потоки созданы сразу, то ни к чему уже таймер: они сами могут уснуть на нужное
время, а потом проснуться без всякого внешнего воздействия.
Но если я поток создам в процедуре таймера OnTimer, то при каждом срабатывании таймера (например, раз в секунду) будет создаваться новый поток, правильно?
...
Рейтинг: 0 / 0
03.07.2013, 15:26
    #38318963
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
satchНо если я поток создам в процедуре таймера OnTimer, то при каждом срабатывании
таймера (например, раз в секунду) будет создаваться новый поток, правильно?

Правильно. Он создастся, сделает что надо и умрёт. Так живут потоки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2013, 15:40
    #38318999
satch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Dimitry SibiryakovsatchНо если я поток создам в процедуре таймера OnTimer, то при каждом срабатывании
таймера (например, раз в секунду) будет создаваться новый поток, правильно?

Правильно. Он создастся, сделает что надо и умрёт. Так живут потоки.
Не вы меня не поняли. Вот пример:
UINT ThreadWatcherEAF(LPVOID pParam)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
{
	MessageBeep(-1);
	return 0;
}
void CMyDlg::StartTimer(void)
{
	SetTimer(1, 1000, 0);
}
void CMyDlg::OnTimer(UINT_PTR nIDEvent)
{
	AfxBeginThread(*MyThread, NULL);

	 CDialogEx::OnTimer(nIDEvent);
}


То есть в данном примере раз в секунду будет создаваться новый поток, да? Например, запущу свое приложение на 10 секунд, и за это время наплодится 10 потоков?
...
Рейтинг: 0 / 0
03.07.2013, 15:50
    #38319018
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
satchза это время наплодится 10 потоков?
Да. В чём проблема-то?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2013, 16:22
    #38319088
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Dimitry Sibiryakov,

Ну, например, в пуле потоков потоки живут иначе. Порой накладные расходы на создание потока столь высоки, по сравнению с заданиями которые они получают, что переходят на использование пулов потоков. Или же пулы потоков просто необходимы, когда требуется жесткий контроль над ресурсами. Вообщем, однозначного рецепта нет - "используй потоки так, и никак иначе", все зависит от задачи.
...
Рейтинг: 0 / 0
03.07.2013, 16:34
    #38319124
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Анатолий ШироковПорой накладные расходы на создание потока столь высоки, по
сравнению с заданиями которые они получают, что переходят на использование пулов потоков.

Если задание такое мелкое, то его проще выполнить прямо в коде OnTimer.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2013, 16:40
    #38319144
satch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Dimitry Sibiryakovsatchза это время наплодится 10 потоков?
Да. В чём проблема-то?
Ну мне, как мне кажется, при создании потока выделяется память, а в данном случае я её бессмысленно расходую, ведь мне нужны не 10 потоков, а один.
...
Рейтинг: 0 / 0
03.07.2013, 16:45
    #38319160
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
satchНу мне, как мне кажется, при создании потока выделяется память, а в данном случае я её бессмысленно расходую, ведь мне нужны не 10 потоков, а один.Если один поток завершился до создания другого, то в чём проблема?
А если не завершился, то, может быть, вам, всё-таки, нужны десять потоков?
...
Рейтинг: 0 / 0
03.07.2013, 17:18
    #38319251
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
satchмне нужны не 10 потоков, а один.
Потоки - средство, а не цель. Их нужно столько, сколько требует задача.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2013, 17:29
    #38319276
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Dimitry Sibiryakov,

Их нужно столько, сколько их использование будет оправдано текущими аппаратными и программными ресурсами. Бездумное и неконтролируемое создание потоков путь в никуда.
...
Рейтинг: 0 / 0
03.07.2013, 17:43
    #38319312
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Анатолий ШироковИх нужно столько, сколько их использование будет оправдано текущими аппаратными и программными ресурсами.На более-менее современном железе и операционках потоки можно создавать тысячами.
Поэтому потоков должно быть столько, сколько требуется в задаче.
...
Рейтинг: 0 / 0
03.07.2013, 18:48
    #38319442
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Basil A. Sidorov,

Ну, удачи тебе с 1000 потоков требуемых для решения задачи на однопроцессорной системе.
...
Рейтинг: 0 / 0
03.07.2013, 19:38
    #38319503
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Анатолий Широков1000 потоков требуемых для решения задачи на однопроцессорной
системе.
Решать мегазадачи на железе с помойки - плохая привычка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2013, 19:46
    #38319514
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Да что тут обсуждать.
Посмотрите на условие задачи.
Юзер нажимает кнопку и после этого раз в несколько секунд запускается один поток.

Где вы тут тысячи потоков нашли? Какая разница какие тут расходы на создание потока?
...
Рейтинг: 0 / 0
03.07.2013, 19:52
    #38319525
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Анатолий ШироковНу, удачи тебе с 1000 потоков требуемых для решения задачи на однопроцессорной системе.В далёких нулевых был у меня дома компьютер, если правильно помню, AMD-что-то-там/300МГц/32Мб.
IBM OS/2 JDK 1.1.8 могла создать только 900 с небольшим потоков. Но не из-за ограничения системы, а из-за собственных проблем.
Так что даже для "железа с помойки" это не задача, а задачка.
...
Рейтинг: 0 / 0
03.07.2013, 20:34
    #38319572
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
satch,

-- я не понял, зачем при потоках ещё и таймер. Обычно он не нужен.
-- учти, что чтобы таймер имел возможность отработать, поток ОБЯЗАН обрабатывать оконные сообщения, (WM_xxx), в рабочих потоках это как правило не так.
-- если потоку надо периодически выполнять какую-то порцию работы, которую ему дает другой поток, то это делается не таймерами, а на event-ах. Отдающий поток кладет данные в какое-то гнездо, и входит event, означающий, что есть что поделать, рабочий поток спит нас этом event, просыпается, когда его ввели, берет из гнезда работу, делает ее и снова засыпает на event.
...
Рейтинг: 0 / 0
03.07.2013, 20:35
    #38319576
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Анатолий Широковsatch,

- создай Event ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396(v=vs.85).aspx)
- блокируйся в потоках на созданном событии ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx)
- при срабатывании таймера устанавливай состояние таймера - это приведет с разблокировке потоков ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms686211(v=vs.85).aspx)

Ok все замечательно, только на фиг нужен таймер?
...
Рейтинг: 0 / 0
03.07.2013, 20:37
    #38319581
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Dimitry SibiryakovsatchНо если я поток создам в процедуре таймера OnTimer, то при каждом срабатывании
таймера (например, раз в секунду) будет создаваться новый поток, правильно?

Правильно. Он создастся, сделает что надо и умрёт. Так живут потоки.


Лучше так не делать, будет слишком много потоков.
...
Рейтинг: 0 / 0
03.07.2013, 20:42
    #38319589
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Anatoly MoskovskyДа что тут обсуждать.
Посмотрите на условие задачи.
Юзер нажимает кнопку и после этого раз в несколько секунд запускается один поток.

Где вы тут тысячи потоков нашли? Какая разница какие тут расходы на создание потока?

Так смотря что он делать будет.
Может каждый про часу считает ...
...
Рейтинг: 0 / 0
04.07.2013, 02:07
    #38319810
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Dimitry Sibiryakov,

В этом и состоит задача программиста - построить многопоточные вычисления так, чтобы они учитывали доступные программно-аппаратные ресурсы. С чем ты здесь конкретно не согласен? Или тебе до фанаря, на какой конфигурации у тебя запускается задача? Видать не все равно, раз ты заговорил о "ведре". Так значит все же многопотоковые вычисления это не столько "жадная" стратегия, а строгая дисциплина связанная с анализом доступным программно-аппаратных ресурсов.
...
Рейтинг: 0 / 0
04.07.2013, 02:19
    #38319813
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
Basil A. Sidorov,

Вообще, у меня был единственная мысль - ты, как программист, должен контролировать создание потоков при организации многопотоковых вычислений. Твоя стратегия, как программиста, должна учитывать доступные программно-аппаратные ресурсы. Если ты бесконтрольно позволяешь своим программам потреблять ресурсы, что можно сказать о надежности твоих программ - задосить их легче легкого. Хотя, что-то мне подказывает, в реальных программах ты и пулы используешь и не даешь бесконтрольно создаваться неограниченному количеству потоков.
...
Рейтинг: 0 / 0
04.07.2013, 08:15
    #38319854
satch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как связать потоковую функцию с таймером
MasterZivsatch,

-- я не понял, зачем при потоках ещё и таймер. Обычно он не нужен.
-- учти, что чтобы таймер имел возможность отработать, поток ОБЯЗАН обрабатывать оконные сообщения, (WM_xxx), в рабочих потоках это как правило не так.
-- если потоку надо периодически выполнять какую-то порцию работы, которую ему дает другой поток, то это делается не таймерами, а на event-ах. Отдающий поток кладет данные в какое-то гнездо, и входит event, означающий, что есть что поделать, рабочий поток спит нас этом event, просыпается, когда его ввели, берет из гнезда работу, делает ее и снова засыпает на event.У меня задача состоит в том, что в программе нужно организовать (асинхронно) опрос 4-х удаленных экземпляров СУБД MySQL на наличие новых данных в таблице (обычный select count(*) from таблица), например, опрашивать все экземпляры с периодичностью 1 раз в 5 сек => выходит что оптимальный вариант - это отдельный поток (скорее всего рабочий, а не интерфейсный) под каждый экземпляр + таймер. А как по-другому?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как связать потоковую функцию с таймером / 25 сообщений из 62, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]