Пауза в приложении.
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Пауза в приложении. Expand / Collapse
Автор
Сообщение
15.11.2006 12:12
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 06.07.2008 10:37
Сообщ.: 236, Visits: 1 734
Добрый день.

Задача - приостановить работу приложения, чтобы нужное окно успело прорисоваться. Нашел в MSDN метод потока Sleep. Кажется то, что нужно, только это метод Класса Thread, следственно вопрос - Как получить поток приложения? А если в приложении несколько потоков ( Используется Timer. ) ?.

Спасибо.

PS: VS 2005. FW 2.0.

Сообщ. #907505
15.11.2006 13:08
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Thread.CurrentThread

В случае нескольких потоков надо просто выполнять всю работу вне первого потока (который обрабатывает все события) и проблем с перерисовкой не будет.

Сообщ. #907515
15.11.2006 15:13
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 06.07.2008 10:37
Сообщ.: 236, Visits: 1 734
Спасибо, bazile.

Это работает. Но как мне кажется, такой подход - приостановка процесса приложения не есть хорошо. Может быть посоветуете что-то другое? Поясню суть проблемы:

Приложение мониторит систему на возникновение определенного события. ( Появляется сообщение об ошибке. ) В этот момент приложение породившее исключение может быть перекрыто другими окнами, поэтому нужно вытащить его на верхний Z уровень, сфоткать и отослать куда надо. :). Так вот, проблема в том, что ScreenShot выполняется сразу после функции SetForegroundWindow и нужное окно не всегда успевает прорисоваться и поэтому получается "каша".

Есть мысль использовать метод WndProc класса NativeWindow для получения события OnPaint этого окна. ( Хэндлер окна имеется. ), чтобы дождаться окончания прорисовки и только после этого продолжить выполнение программы. Но с реализацией туговато.

Как думаете, сработает ли такой подход? Имеет смысл тратить время на его реализацию? Или есть способ проще?

Сообщ. #907531
15.11.2006 16:59
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Использовать паузу в этом случае не очень хорошая идея, согласен, но другого рабочего способа тоже предложить не могу.
Сообщ. #907565
21.11.2006 0:05


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541, Visits: 16 997
А как насчет Control.DrawToBitmap ?

UPD. А, пардон, окно-то не managed может быть... Тогда, пожалуй, можно поставить хук на WH_SHELL и ловить HSHELL_WINDOWACTIVATED сразу после отлова ошибки.


Сообщ. #907738
24.11.2006 17:21
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 06.07.2008 10:37
Сообщ.: 236, Visits: 1 734
Вы правы, уважаемый messir, окошко именно "неуправляемое", и проблема как раз в синхронизации процесса SetForegroundWindow и процесса приложения. Т.е. код примерно следующий:

public void CaptureWindowToFile( string filename, ImageFormat format )

{

IntPtr handler = User32.FindWindow( "AnyNameClass", "AnyNameWindow" );

User32.SetForegroundWindow ( handler );

/* Следующая функция не "ждет" завершения выполнения предыдущей т.к.

 это - [DllImport( "USER32.DLL" )]public static extern bool SetForegroundWindow

( IntPtr hWnd );, объявленная в static классе User32 */

Image img = CaptureWindow( User32.GetDesktopWindow( ) );

...

}

Я где то читал, что с помощью NativeWindow можно "подменить" событие окна на свое, тем самым видимо можно синхронизировать выполнение этих процессов. Кто нибудь знает так ли это?

Сообщ. #907961
25.11.2006 0:18


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541, Visits: 16 997
slamer (24.11.2006)
Я где то читал, что с помощью NativeWindow можно "подменить" событие окна на свое, тем самым видимо можно синхронизировать выполнение этих процессов. Кто нибудь знает так ли это?

Так-то оно так, только что перехватывать? Можно WM_PAINT, в принципе, и давать команду на полную перерисовку...


Сообщ. #907979
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 1:49