Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке?

Ответить
Настройки темы
Delphi - WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке?

Аватара для XCodeR

Ветеран


Сообщения: 878
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


Собственно сабж.

Т.к. иногда во время загрузки программы происходит различная ресурсоемкая работа с БД или с другими ресурсами. Необходимо чтобы появился SplashScreen на нем игралась какая-нибудь анимация, а по завершению инициализации программы он закрылся.

Отправлено: 11:09, 11-03-2007

 

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


XCodeR
Я бы сделал что-то наподобие следующего(извини,что код на асме,просто мне влом браться за дельфи ) :
Код: Выделить весь код
MainProc      proc
; /* Создаём событие, которое будет служить сигналом */
        push    offset szSplash
        push    FALSE  ; Создаём событие как nonsignaled 
        push    TRUE   ; Создаём manual-reset событие
        push    NULL
        call      CreateEventA
        mov     hSplashEvent, eax
; /* Создаём поток */
        push    NULL
        push    NULL
        push    NULL
        push    offset ShowSplash ; адрес процедуры, где будет создаватся SplashScreen
        push    NULL
        push    NULL
        call      CreateThread
        mov     hSplashRoutineThread, eax
; /* Имитируем ресурсоёмкую работу */
        push    10000
        call       Sleep
; /* Теперь меняем состояние события, сигнализируя о конце ресурсоёмкой работы */
        push    hSplashEvent
        call       SetEvent
; /* Закрываем описатель потока */
        push    hSplashRoutineThread
        call       CloseHandle
; /* Закрываем описатель события */
        push    hSplashEvent
        call       CloseHandle
        ret
MainProc      endp

ShowSplash     proc
; /* Регистрируем класс создаваемого splash-окна */
...
; /* Создаём само окно */
...
; /* Ждём сигнала из основного потока */
        push    INFINITE
        push    hSplashEvent
        call       WaitForSingleObject
; /* Теперь, когда функция WaitForSingleObject возвратится, уничтожаем окно и снимаем регистрацию класса */
...
; /* Закрываем поток */
        push    NULL
        call       ExitThread
ShowSplash     endp
При регистрации класса splash-окна необходимо указать отдельную оконную процедуру, которая должна обрабатывать сообщение WM_DESTROY для уничтожения окна.

Примерно так...

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:19, 12-03-2007 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для XCodeR

Ветеран


Сообщения: 878
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


DillerInc
арр, не люблю я ассемблер.... ((
но будем разбираться - Спасибо...

Отправлено: 16:46, 12-03-2007 | #3


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Цитата:
арр, не люблю я ассемблер.... ((
...

Лады,попробуем тогда так:
Код: Выделить весь код
var
 SplashWindowClass : TWndClass;
 hSplashWnd, hSplashEvent, hSplashRoutineThread : HWND;

function SplashWindowProc(hWnd : HWND; uMsg : UINT; wParam : WPARAM;
                    lParam : LPARAM) : LRESULT; stdcall;
begin
 Result := DefWindowProc(hWnd, uMsg, wParam, lParam);

if uMsg = WM_DESTROY then
 PostQuitMessage(0);
end; // SplashWindowProc

procedure MainProc;
 hSplashEvent := CreateEvent(0, true, false, 'SplashEvent');
 hSplashRoutineThread := CreateThread(0, 0, @ShowSplashWindow, 0, 0, 0);

 Sleep(10000);

 SetEvent(hSplashEvent);
 CloseHandle(hSplashRoutineThread);
 CloseHandle(hSplashEvent);
end; // MainProc

procedure ShowSplashWindow;
 SplashWindowClass.style := CS_HREDRAW or CS_VREDRAW;
 SplashWindowClass.lpfnWndProc := @SplashWindowProc;
 SplashWindowClass.hInstance := Instance;
 SplashWindowClass.hIcon := LoadIcon(0, IDI_APPLICATION);
 SplashWindowClass.hCursor := LoadCursor(0, IDC_ARROW);
 SplashWindowClass.hbrBackground := COLOR_BACKGROUND;
 SplashWindowClass.lpszClassName := 'Splash';

 RegisterClass(SplashWindowClass);
 hSplashWnd := CreateWindow('Splash', 'SplashScreen',
                          WS_POPUP,
                          350, 300, 400, 250, 0, 0, Instance, NIL);
 ShowWindow(hSplashWnd, SW_SHOW);
 UpdateWindow(hSplashWnd);

 WaitForSingleObject(hSplashEvent, INFINITE);

 DestroyWindow(hSplashWnd);
 UnregisterClass('Splash', Instance);
 ExitThread(0);
end; // ShowSplashWindow
Возможны ошибки.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:47, 12-03-2007 | #4


Аватара для XCodeR

Ветеран


Сообщения: 878
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


DillerInc
вот так уже лучше)
видны знакомые буковки)

еще раз спасибо.

Отправлено: 19:51, 12-03-2007 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Win32API: Оптимальная организация асинхронного чтения COM-порта в отдельном потоке CyraxZ Программирование и базы данных 3 19-02-2007 10:02
Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI DillerInc Программирование и базы данных 60 13-03-2006 21:36
Delphi - Win32 API | Delphi | Странности с Winapi Timer Mavlyudov Программирование и базы данных 4 14-11-2005 10:10
Delphi - Delphi, WinAPI | Корректное завершение программы fossil Программирование и базы данных 6 10-08-2005 14:52
Delphi - *Решено* | Использование WinAPI под Delphi Savant Программирование и базы данных 2 14-01-2005 21:40




 
Переход