Странная проблема с бесконечным циклом while в EXE

Я столкнулся со странной проблемой в Windows CE:

Запуск 3 EXE-файлов

1) Первый исполняемый файл выполняет некоторую работу каждые 8 ​​минут, если не поступает сигнал о выходе. 2) Второй исполняемый файл выполняет некоторую работу каждые 5 минут, если не указано событие выхода. 3) Третий исполняемый цикл while работает, а в цикле while он выполняет некоторую работу в случайное время. Этот цикл while продолжается до тех пор, пока не появится сигнал о выходе.

Теперь это событие выхода является глобальным событием и может сигнализироваться любым процессом.

Проблема в Когда я запускаю First exe, он работает нормально, Запустите второй exe, он отлично работает, запустите третий exe, он отлично работает

Когда я запускаю все exes, запускается только третий exe, и никакие инструкции не выполняются в первом и втором.

Как только третий exe будет завершен, первый и второй начнут обработку. Может быть, цикл while в третьем exe занимает все циклы ЦП? Я не пробовал ставить Sleep, но думаю, что это поможет. Но ОС должна отдавать CPU всем процессам ... Какие-нибудь мысли ???

Не уверен, что квантование времени работает так же в Windows CE, но могу ошибаться

Robert Gould 14.11.2008 09:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
466
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Поместите цикл while в третий EXE-файл в режим сна каждый раз при прохождении цикла и посмотрите, что произойдет. Даже если это не исправляет эту конкретную проблему, никогда не рекомендуется опрашивать с помощью цикла while, и даже использование Sleep внутри цикла является плохой заменой правильному таймеру.

Да, я думаю, это не лучшее решение. Я могу попробовать использовать таймер и посмотреть результаты ..

На MSDN я также читал, что CE допускает (менее) 32 процессов одновременно. (Однако переключение контекста происходит молниеносно ...). Некоторые уже заняты системными службами.

Интересно. Однажды я взял на себя управление приложением .NET CF, которое создавало новые процессы внутри цикла while. Я знал, что это было супер-плохо, но вот дополнительная информация о том, почему.

MusiGenesis 14.11.2008 19:37

(Из памяти) Процессы в Windows CE выполняются до завершения, если нет запущенных процессов с более высоким приоритетом, или они выполняются в течение своего временного интервала (100 мс), если выполняются другие процессы с таким же приоритетом. Я не уверен, дает ли Windows CE процессу с активным / приоритетным окном небольшое повышение приоритета (точно так же, как настольная Windows) или нет.

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

  • Сделайте так, чтобы третий процесс ждал / блокировал некоторые многопроцессорные примитивы (мьютекс, семафор и т. д.) И имел короткий тайм-аут. Использование WaitForMultipleObjects / WaitForSingleObject и т. д.
  • Заставьте третий процесс ждать, используя вызов Sleep каждый раз в цикле обработки.
  • Повысьте приоритет других процессов, чтобы, когда им нужно было запустить, они прерывали третий процесс и фактически запускались. Я бы, вероятно, сделал так, чтобы наименее часто вызываемый процесс имел наивысший приоритет из трех.

Еще одна вещь, которую следует проверить, - это то, что третий процесс действительно выполняет свои задачи вовремя и не привязывает ЦП к попыткам нормально выполнять свои задачи.

Другие вопросы по теме