Nano Hash - криптовалюты, майнинг, программирование

Как выполнять действие каждую секунду в потоке?

Я знаю, что таймеры созданы для выполнения периодических действий, но я не уверен, являются ли таймеры лучшим способом выполнения периодических действий в потоке, я пытаюсь получить некоторую информацию из рабочих потоков, чтобы быть яснее: есть основной поток, которому нужно получить свойство другого потока (woker), это вариант, поэтому мне нужно получать его значение каждый интервал времени. это что-то вроде:

procedure mainThread.execute;
begin
// every second :
val := workerThread.property;
end;

Обычно основной поток должен подождать секунду, а затем получить значение, например:

procedure mainThread.execute;
begin
while (condition) do
begin
sleep(1000);
val := workerThread.property;
end; 

Но что, если рабочий поток завершается, а основной поток все еще ожидает получения значения sleep(1000) , это приведет к потере времени, потому что основной поток должен немедленно выйти из цикла, когда рабочий поток завершится. Я не хочу, чтобы основной поток ждал, если рабочий поток уже завершил свою работу (нет необходимости получать значение этого свойства, если рабочий поток занимает менее 1 секунды), поэтому я не должен делать это таким образом. Я также думал об использовании waitformultipleobjects в этом цикле, поэтому, предполагая, что у меня много worker:, это будет:

procedure mainThread.execute;
begin
while (condition) do
begin
waitForMultipleObjects(Threads, @Array, True, 1000);
//If elapsed Time < 1000 , this means that all threads terminated, then main thread must quit this loop
//If elapsed Time = 1000 :
val := workerThread.property;
// Calculate the new value of condition  
end;

Итак, чего я хочу добиться, так это: основной поток должен выйти из цикла, только если:

  • все рабочие потоки завершены (сразу после их завершения): пока основной поток ожидает получения значения свойства, если потоки завершаются, основной поток выходит из цикла, если нет, он продолжает ждать, пока не истечет время = 1 с, и получить новое значение .
  • условие ложно. У меня нет проблем с установкой условия в false, потому что я должен вычислять что-то на каждой итерации и определять его новое значение.

Надеюсь, я был понятен в своем объяснении.

Спасибо за ваши ответы.


  • Самый простой способ — вызвать Sleep(1000) в цикле, выполняя свои действия в каждой итерации цикла. В качестве альтернативы используйте CreateWaitableTimer() и WaitForSingleObject() вместо Sleep(). 05.03.2016
  • Почему вы думаете, что таймер не лучший способ? 06.03.2016
  • Извините за неясность, смотрите мое редактирование. 06.03.2016

Ответы:


1

WaitForMultipleObjects действительно является функцией, которую вы должны вызывать. Ваша проблема заключается в том, что вы не можете проверить возвращаемое значение. Вот практическое правило, когда вы вызываете функцию Windows API:

Всегда проверяйте значение, возвращаемое функцией.

Вы избежите многих проблем, если будете следовать этому правилу.

В этом случае документация говорит, что при передаче True для bWaitAll:

  • Возвращаемое значение от WAIT_OBJECT_0 до (WAIT_OBJECT_0 + nCount– 1) означает, что функция вернулась, потому что все указанные объекты получили сигнал.
  • Возвращаемое значение WAIT_TIMEOUT означает, что функция вернула значение по истечении указанного времени ожидания.
  • Возвращаемое значение WAIT_FAILED указывает на то, что вызов по какой-то причине завершился неудачно, и вам следует позвонить GetLastError, чтобы узнать, в чем причина.

Обратите внимание, что вам не нужно беспокоиться о случае WAIT_ABANDONED_0 в (WAIT_ABANDONED_0 + nCount– 1), поскольку вы не передаете никаких объектов мьютекса.

07.03.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..