C # взаимодействие диалога потока - PullRequest
1 голос
/ 15 апреля 2010

K Я смотрю в основном на однопоточное приложение Windows Forms 3.0. Недавно моему боссу добавили диалог прогресса в отдельном потоке, чтобы пользователь мог видеть некоторую активность, когда основной поток уходил, выполнял тяжелую работу и блокировал графический интерфейс.

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

Но если запускается длительная sql-операция, события не запускаются. Я попытался перехватить команду WndProc, но это также появляется в очереди, когда выполняется длительная операция sql. Я также пытался подобрать процессы, найти текущее приложение и проверить различные значения памяти, используемые в потоке прогресса, и тому подобное, но до тех пор, пока операция sql не завершится, ни одно из них не будет обновлено. При удалении верхнего элемента диалоговое окно исчезает при активации другого приложения, но если основное приложение затем возвращается, оно больше не появляется.

Так что мне нужен способ узнать, свернут ли другой поток или больше не активен, что не включает в себя запрос реального потока, поскольку он блокируется, пока не завершится операция sql.

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

Любая помощь приветствуется

1 Ответ

0 голосов
/ 15 апреля 2010

Звучит так, как будто длительная операция связана с диалогом прогресса? Обычно это плохая идея, и мне интересно, можно ли вообще показать прогресс.
Однако вам следует рассмотреть возможность использования BackgroundWorker для ваших длительных операций. Таким образом, ваш графический интерфейс (основная форма и диалог прогресса остаются в силе).
Таким образом, вы сможете отправлять событие минимизации основной формы в диалоговое окно прогресса, которое может мгновенно реагировать на него.

Btw. BackgroundWorker самостоятельно поддерживает отчеты о проделанной работе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...