Автор | Сообщение |
|
| |
Пост N: 347
Зарегистрирован: 17.06.10
|
|
Отправлено: 18.06.15 09:11. Заголовок: Картинка "ожидания"
Кто чем изображает ожидание выполнения процесса (напр.коннекта) ? Удобно использовать анимированный gif. У меня есть какой-то, крутящуюся шестеренку изображает. Все нормально, но иногда может пуститься в инверсном режиме
|
|
|
Ответов - 62
, стр:
1
2
3
4
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 4298
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.15 16:49. Заголовок: Dima пишет: Попробу..
Dima пишет: А как его прикрутить к Far 3.0 Там же: Arc, Far 1.x, x86
|
|
|
|
| |
Пост N: 4944
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.06.15 17:16. Заголовок: я и не пытался , но ..
я и не пытался , но там есть avixtr.exe , он тебе и нужен
|
|
|
|
| постоянный участник
|
Пост N: 4300
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.15 18:56. Заголовок: Коряво он как то дел..
Коряво он как то делает ....
|
|
|
|
| постоянный участник
|
Пост N: 4307
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.15 04:08. Заголовок: Dima пишет: Считать..
Dima пишет: цитата: | Считать в массив имена извлеченных фреймов и затем выводить их в цикле в потоке средствами Минигуи , можешь ? |
| Отдельный вывод получился - пример demo3.prg А в потоке не получается - пример demo4.prg ( окно висит без прелодера и время не показывает ) Что не так делаю ? Проекты тут - https://cloud.mail.ru/public/BrN3/d4atak4Rv
|
|
|
|
| постоянный участник
|
Пост N: 4308
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.15 13:35. Заголовок: Выспался и кажись по..
Выспался и кажись понял в чём дела... Исправлю сейчас...
|
|
|
|
| |
Пост N: 4975
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.15 14:08. Заголовок: Пример 4 , ну во пер..
Пример 4 , ну во первых надо собрать с ключем /MT Далее , переделал FUNCTION WaitingProcess() 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 + 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 При чем часики показывают а вот картинок нет....... Упс ))) Надо завести demo4.rc
|
|
|
|
| |
Пост N: 4976
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.15 14:24. Заголовок: Dima пишет: th:=hb..
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 нужно делать проверку а есть ли форма
|
|
|
|
| постоянный участник
|
Пост N: 4310
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.15 15:41. Заголовок: Dima пишет: При чем..
Dima пишет: цитата: | При чем часики показывают а вот картинок нет....... Упс ))) Надо завести demo4.rc |
| У меня то же самое... Может ресурсы не подтягиваются в отдельный поток ? Dima пишет: цитата: | hb_threadDetach(th) уже не нужен , но тогда в WaitWinTimer нужно делать проверку а есть ли форма |
| Лучше сделать автоинкремент окна cFormName := "WaitWin_" + HB_NtoS( _GetId() ), а поток убивать. Иначе потоки будут засорять память ! Или я неправ ?
|
|
|
|
| |
Пост N: 4978
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.15 15:42. Заголовок: я могу выложить рабо..
я могу выложить рабочий пример если ты не понял все правки что я сделал
|
|
|
|
| постоянный участник
|
Пост N: 4311
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.15 16:09. Заголовок: Dima пишет: я могу ..
Dima пишет: цитата: | я могу выложить рабочий пример если ты не понял все правки что я сделал |
| Да понял я уже, разобрался. Но как всегда тянет на улучшения. Решил сократить код. Создаю окно ожидания (прелодера) сразу в потоке. Потом убиваю поток - окно остаётся на экране. Делаю по другому, запоминаю в статик переменную имя окна, а потом убиваю окно. Нифига - вылет по ошибке. Вот пример - https://cloud.mail.ru/public/GiWn/cEYHCiBVT А в чем разница: hb_threadStart( HB_THREAD_INHERIT_PUBLIC, @WaitWinTimer(), aBegin ) и hb_threadStart( HB_THREAD_INHERIT_MEMVARS, @WaitWinTimer(), @aBegin) ?
|
|
|
|
| |
Пост N: 4980
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.15 16:14. Заголовок: Неа с LETO я не буду..
Неа с LETO я не буду смотреть пример , нет его у меня уже да и сервис ставить не хочу , давай без LETO ;)
|
|
|
|
|
| |
Пост N: 4981
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.15 16:16. Заголовок: Andrey пишет: HB_TH..
Andrey пишет: Андрей есть описание в доке Александра !!!
|
|
|
|
| постоянный участник
|
Пост N: 4312
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.15 16:17. Заголовок: Dima пишет: Неа с L..
Dima пишет: цитата: | Неа с LETO я не буду смотреть пример , нет его у меня уже да и сервис ставить не хочу , давай без LETO ;) |
| Извиняюсь, не та ссылка. Вот правильная ссылка - https://cloud.mail.ru/public/BdQH/CiZE7Ubz1
|
|
|
|
| |
Пост N: 4982
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.15 16:34. Заголовок: Ну так ты конкретно ..
Ну так ты конкретно переделал ;) В потоке окно создаешь , не знаю правильно ли это. Вот DEMO4.pRG рабочий (не забудь DEMO4.RC) Скрытый текст /* * 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
| А пример понятно чего падает ;) Ты в начале убиваешь окно которое создано в потоке а пока оно убивается поток все еще пишет на это окно а затем убиваешь поток в котором это же окно и создавалось. Как то не стыкуется все для меня как новичка ;) И я не уверен что поток увидит STATIC переменную заявленную в MAIN модуле (это догадка) До кучи ,окно создано в потоке и я так понимаю доступа к нему из основной программы не получить.
|
|
|
|
| постоянный участник
|
Пост N: 4313
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.15 17:10. Заголовок: Dima пишет: Ну так ..
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) Как сделать (убить окно в потоке) ?
|
|
|
|
| |
Пост N: 4983
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.15 17:16. Заголовок: Наверное Минигуи (эт..
Наверное Минигуи (это предположение) ни чего не знает про окна созданные в потоке , если я не прав , пусть меня поправят
|
|
|
|
| |
Пост N: 4984
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.15 17:29. Заголовок: Можно попробовать пе..
Можно попробовать перед тем как убить окно (WaitWinClose) , средствами Минигуи получить список всех дочерних окон , будет ли среди них окно заявленное в потоке. И тогда все будет понятно ;) Но по любасу если проблему с закрытием окно и решишь то на следующей строке прога у тебя свалится так как поток будет жить и будет писать в окно которого уже нет.
|
|
|
|
| |
Пост N: 4985
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.06.15 18:09. Заголовок: Вставь перед убитием..
Вставь перед убитием окна aChild := {} EnumChildWindows( GetFormHandle("Form1"), { |hChild| AADD( aChild, hChild ), .T. }, 0 ) там дальше я не знаю как по хендлу получить имя окна , если получишь выведи все в MSGINFO и смотри есть ли там окно созданное в потоке EnumChildWindows сырцы есть в примерах.
|
|
|
|
| постоянный участник
|
Пост N: 4315
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.15 19:11. Заголовок: Dima пишет: EnumChi..
Dima пишет: цитата: | EnumChildWindows сырцы есть в примерах. |
| Так я же его и делал...
|
|
|
|
| постоянный участник
|
Пост N: 4316
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.15 19:20. Заголовок: Вот можешь этой прог..
|
|
|
Ответов - 62
, стр:
1
2
3
4
All
[только новые]
|
|