Форум » GUI » Картинка "ожидания" » Ответить

Картинка "ожидания"

fil: Кто чем изображает ожидание выполнения процесса (напр.коннекта) ? Удобно использовать анимированный gif. У меня есть какой-то, крутящуюся шестеренку изображает. Все нормально, но иногда может пуститься в инверсном режиме

Ответов - 62, стр: 1 2 3 4 All

Andrey: Dima пишет: Попробуй http://plugring.farmanager.com/plugin.php?pid=578&l=ru А как его прикрутить к Far 3.0 Там же: Arc, Far 1.x, x86

Dima: я и не пытался , но там есть avixtr.exe , он тебе и нужен

Andrey: Коряво он как то делает ....


Andrey: Dima пишет: Считать в массив имена извлеченных фреймов и затем выводить их в цикле в потоке средствами Минигуи , можешь ? Отдельный вывод получился - пример demo3.prg А в потоке не получается - пример demo4.prg ( окно висит без прелодера и время не показывает ) Что не так делаю ? Проекты тут - https://cloud.mail.ru/public/BrN3/d4atak4Rv

Andrey: Выспался и кажись понял в чём дела... Исправлю сейчас...

Dima: Пример 4 , ну во первых надо собрать с ключем /MT Далее , переделал FUNCTION WaitingProcess() [pre2] FUNCTION WaitingProcess() LOCAL nI, cMsg, nTime Local Th PRIVATE aBegin PRIVATE lexit:=.t. aBegin := WaitWinCreate( "Working..." ) // Запускаем в отдельном потоке (preloding) th:=hb_threadStart(HB_THREAD_INHERIT_MEMVARS, @WaitWinTimer(), @aBegin) nTime := SECONDS() FOR nI := 1 TO 10 Form1.Label_1.Value := 'For nI := ' + HB_NtoS(nI) // final waiting INKEYGUI(500) DO EVENTS NEXT //DoMethod(aBegin[1],'Release') // убить окно ожидания lexit:=.f. hb_threadDetach(th) WaitWinClose(aBegin) // убить окно ожидания cMsg := "Elapsed processing time - " + SECTOTIME( SECONDS() - nTime ) MsgInfo(cMsg) RETURN NIL [/pre2] + [pre2] FUNCTION WaitWinTimer(aDim) LOCAL cFormName := aDim[1], aPict := aDim[2], nTime := aDim[3] LOCAL cTime := "Time passed " + SECTOTIME( SECONDS() - nTime ) LOCAL cPict do while lexit M->nILogoWait ++ // номер показа картинки M->nILogoWait := IIF( M->nILogoWait > LEN(aPict), 1, M->nILogoWait ) cPict := aPict[M->nILogoWait] cTime := "Time passed " + SECTOTIME( SECONDS() - nTime ) SetProperty( cFormName, "Label_1", "Value", cTime ) SetProperty( cFormName, "Image_1", "Picture", cPict ) InkeyGui(100) DO EVENTS enddo RETURN NIL [/pre2] При чем часики показывают а вот картинок нет....... Упс ))) Надо завести demo4.rc

Dima: Dima пишет: th:=hb_threadStart(HB_THREAD_INHERIT_MEMVARS, @WaitWinTimer(), @aBegin) Хотя тут можно конечно как и было hb_threadDetach(hb_threadStart(HB_THREAD_INHERIT_MEMVARS, @WaitWinTimer(), @aBegin)) Dima пишет: lexit:=.f. hb_threadDetach(th) hb_threadDetach(th) уже не нужен , но тогда в WaitWinTimer нужно делать проверку а есть ли форма

Andrey: Dima пишет: При чем часики показывают а вот картинок нет....... Упс ))) Надо завести demo4.rc У меня то же самое... Может ресурсы не подтягиваются в отдельный поток ? Dima пишет: hb_threadDetach(th) уже не нужен , но тогда в WaitWinTimer нужно делать проверку а есть ли форма Лучше сделать автоинкремент окна cFormName := "WaitWin_" + HB_NtoS( _GetId() ), а поток убивать. Иначе потоки будут засорять память ! Или я неправ ?

Dima: я могу выложить рабочий пример если ты не понял все правки что я сделал

Andrey: Dima пишет: я могу выложить рабочий пример если ты не понял все правки что я сделал Да понял я уже, разобрался. Но как всегда тянет на улучшения. Решил сократить код. Создаю окно ожидания (прелодера) сразу в потоке. Потом убиваю поток - окно остаётся на экране. Делаю по другому, запоминаю в статик переменную имя окна, а потом убиваю окно. Нифига - вылет по ошибке. Вот пример - https://cloud.mail.ru/public/GiWn/cEYHCiBVT А в чем разница: hb_threadStart(HB_THREAD_INHERIT_PUBLIC, @WaitWinTimer(), aBegin ) и hb_threadStart(HB_THREAD_INHERIT_MEMVARS, @WaitWinTimer(), @aBegin) ?

Dima: Неа с LETO я не буду смотреть пример , нет его у меня уже да и сервис ставить не хочу , давай без LETO ;)

Dima: Andrey пишет: HB_THREAD_INHERIT_PUBLIC Андрей есть описание в доке Александра !!!

Andrey: Dima пишет: Неа с LETO я не буду смотреть пример , нет его у меня уже да и сервис ставить не хочу , давай без LETO ;) Извиняюсь, не та ссылка. Вот правильная ссылка - https://cloud.mail.ru/public/BdQH/CiZE7Ubz1

Dima: Ну так ты конкретно переделал ;) В потоке окно создаешь , не знаю правильно ли это. Вот DEMO4.pRG рабочий (не забудь DEMO4.RC) [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2015 Verchenko Andrey <verchenkoag@gmail.com> */ #include "minigui.ch" #include "hbthread.ch" PROCEDURE Main PUBLIC nILogoWait DEFINE WINDOW Form1 ; AT 0 , 0 ; WIDTH 600 HEIGHT 400 ; TITLE "Window with expectation (preloding) in stream" ; BACKCOLOR {0,176,240} ; MAIN @ 10, 0 LABEL Label_1 WIDTH 600 HEIGHT 28 ; VALUE 'For:' SIZE 16 BOLD TRANSPARENT CENTERALIGN @ 50,20 BUTTON Btn_Start CAPTION "Start!" WIDTH 140 HEIGHT 48 ; ACTION WaitingProcess() @ 130,20 BUTTON Btn_End CAPTION "Close" WIDTH 140 HEIGHT 48 ; ACTION ThisWindow.Release() END WINDOW CENTER WINDOW Form1 ACTIVATE WINDOW Form1 RETURN /////////////////////////////////////////////////////////////////// FUNCTION WaitingProcess() LOCAL nI, cMsg, nTime Local Th PRIVATE aBegin PRIVATE lexit:=.t. aBegin := WaitWinCreate( "Working..." ) // создать окно ожидания // Запускаем в отдельном потоке (preloding) th:=hb_threadStart(HB_THREAD_INHERIT_MEMVARS, @WaitWinTimer(),@aBegin) nTime := SECONDS() FOR nI := 1 TO 50 Form1.Label_1.Value := 'For nI := ' + HB_NtoS(nI) // final waiting INKEYGUI(100) DO EVENTS NEXT lexit:=.f. hb_threadDetach(th) WaitWinClose(aBegin) // убить окно ожидания cMsg := "Elapsed processing time - " + SECTOTIME( SECONDS() - nTime ) MsgInfo(cMsg) RETURN NIL ////////////////////////////////////////////////////////////////////////////// FUNCTION WaitWinCreate( cTitle, lCenter, nWRow, nWCol) LOCAL nI, cFormName := "WaitWin_" + AllTRim( Str( _GetId() ) ) LOCAL nTime := SECONDS() LOCAL aPict := {"FR01","FR02","FR03","FR04","FR05","FR06","FR07","FR08",; "FR09","FR10","FR11","FR12"} DEFAULT cTitle := "Wait", lCenter := .T., nWRow := 0, nWCol := 0 M->nILogoWait := 1 // номер показа картинки //SET INTERACTIVECLOSE OFF DEFINE WINDOW &cFormName ; ROW 0 COL 0 ; WIDTH 420 HEIGHT 230 ; TITLE cTitle ; MODAL NOSYSMENU NOSIZE ; BACKCOLOR WHITE ; FONT 'Tahoma' SIZE 12 @ 10,10 LABEL Label_1 ; WIDTH 400 HEIGHT 20 ; VALUE "Time passed " + TIME() ; CENTERALIGN VCENTERALIGN TRANSPARENT @ 40, (420-128)/2 IMAGE Image_1 PICTURE aPict[1] ; WIDTH 128 HEIGHT 128 ; WHITEBACKGROUND TRANSPARENT @ 40 + 128 + 2, 10 LABEL Label_2 ; WIDTH 400 HEIGHT 20 ; VALUE 'Wait a little is being processed ...' ; CENTERALIGN VCENTERALIGN TRANSPARENT END WINDOW Center Window &cFormName IF lCenter == .F. SetProperty( cFormName, "Row", nWRow ) SetProperty( cFormName, "Col", nWCol ) ENDIF Activate Window &cFormName NoWait RETURN { cFormName, aPict, nTime } // вернуть номер окна, чтобы по нему потом убить окно ////////////////////////////////////////////////////////////////////// FUNCTION WaitWinTimer(aDim) LOCAL cFormName := aDim[1], aPict := aDim[2], nTime := aDim[3] LOCAL cTime := "Time passed " + SECTOTIME( SECONDS() - nTime ) LOCAL cPict do while lexit M->nILogoWait ++ // номер показа картинки M->nILogoWait := IIF( M->nILogoWait > LEN(aPict), 1, M->nILogoWait ) cPict := aPict[M->nILogoWait] cTime := "Time passed " + SECTOTIME( SECONDS() - nTime ) SetProperty( cFormName, "Label_1", "Value", cTime ) SetProperty( cFormName, "Image_1", "Picture", cPict ) InkeyGui(50) DO EVENTS enddo RETURN NIL ////////////////////////////////////////////////////////////////////// FUNCTION WaitWinClose(aDim) LOCAL cFormName := aDim[1] Domethod(cFormName,"Release") DO MESSAGE LOOP RETURN NIL [/pre2] А пример понятно чего падает ;) Ты в начале убиваешь окно которое создано в потоке а пока оно убивается поток все еще пишет на это окно а затем убиваешь поток в котором это же окно и создавалось. Как то не стыкуется все для меня как новичка ;) И я не уверен что поток увидит STATIC переменную заявленную в MAIN модуле (это догадка) До кучи ,окно создано в потоке и я так понимаю доступа к нему из основной программы не получить.

Andrey: Dima пишет: Ну так ты конкретно переделал ;) Зато более понятный код становиться. Dima пишет: И я не уверен что поток увидит STATIC переменную заявленную в MAIN модуле (это догадка) Переменную то видит. Можно проверить. Вот простой код: WaitWinClose(cStaticIdWinWait) // убить окно ожидания ...... ////////////////////////////////////////////////////////////////////// FUNCTION WaitWinClose(cFormName) Domethod(cFormName,"Release") // строка 136 DO MESSAGE LOOP RETURN NIL Самое интересное что окно в потоке не видит, из-за этого наверно и ошибка: Error MGERROR/0 Window: WaitWin_16944 is not defined. Program terminated. Called from MSGMINIGUIERROR(94) Called from DOMETHOD(4663) Called from WAITWINCLOSE(136) Как сделать (убить окно в потоке) ?

Dima: Наверное Минигуи (это предположение) ни чего не знает про окна созданные в потоке , если я не прав , пусть меня поправят

Dima: Можно попробовать перед тем как убить окно (WaitWinClose) , средствами Минигуи получить список всех дочерних окон , будет ли среди них окно заявленное в потоке. И тогда все будет понятно ;) Но по любасу если проблему с закрытием окно и решишь то на следующей строке прога у тебя свалится так как поток будет жить и будет писать в окно которого уже нет.

Dima: Вставь перед убитием окна aChild := {} EnumChildWindows( GetFormHandle("Form1"), { |hChild| AADD( aChild, hChild ), .T. }, 0 ) там дальше я не знаю как по хендлу получить имя окна , если получишь выведи все в MSGINFO и смотри есть ли там окно созданное в потоке EnumChildWindows сырцы есть в примерах.

Andrey: Dima пишет: EnumChildWindows сырцы есть в примерах. Так я же его и делал...

Andrey: Вот можешь этой прогой пользоваться, я её до конца не доделал (картинки в ГРИД не поставил от окон) - но так работает. https://cloud.mail.ru/public/FWC8/LhYGEB5R6



полная версия страницы