Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке? (http://forum.oszone.net/showthread.php?t=80721)

XCodeR 11-03-2007 11:09 560164

WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке?
 
Собственно сабж.

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

DillerInc 12-03-2007 11:19 560530

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 для уничтожения окна.

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

XCodeR 12-03-2007 16:46 560688

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

DillerInc 12-03-2007 18:47 560744

Цитата:

арр, не люблю я ассемблер.... ((
... ;)

Лады,попробуем тогда так:
Код:

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

Возможны ошибки.

XCodeR 12-03-2007 19:51 560765

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

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


Время: 01:51.

Время: 01:51.
© OSzone.net 2001-