|
|
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
При нажатии кнопки должен выполняться следующий код (отображение информационной надписи), Код: pascal 1. 2. а затем довольно долгая (несколько секунд) процедура архивации. Во время архивации LabelWait должна отображать надпись "ПОДОЖДИТЕ..." Так вот, при нажатии кнопки надпись не отображается, вместо этого кнопка зависает в нажатом состоянии до тех пор, пока процедура архивации не закончится, и потом отмораживается, и только после этого появляется надпись "Подождите..." на миг, после чего, естественно вызывается оператор спрятать эту надпись и отобразить "Готово!" Пытался выйти из положения следующим способом: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Однако это не помогло. Кнопка по-прежнему зависает до окончания архивации, и никакая надпись не появляется до окончания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 02:59:50 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
svnvlad, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Такие вещи (длительную обработку чего-либо) обычно выносят в отдельный тред. То есть как-то так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 03:59:02 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
_Navy_ Код: pascal 1. не очень-то безопасен сможет обработать нажатие клавиш или мышки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 08:34:45 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
ну и сразу - из доп. потоков нельзя без синхронизации обращаться к большинству визуальных компонент VCL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 08:56:54 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
svnvladОднако это не помогло. Кнопка по-прежнему зависает до окончания архивации, и никакая надпись не появляется до окончания. Попробуй https://github.com/wadman/wthread/ :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 08:57:44 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
//Так вот, при нажатии кнопки надпись не отображается А что должна ? :) И где после LabelWait.Visible := true LabelWait.Refresh ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 09:24:19 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
svnvladКнопка по-прежнему зависает до окончания архивации, и никакая надпись не появляется до окончания. абсолютно предсказуемое поведение. Как советовали выше, только архивация в доп.потоке с перерисовкой надписи в основном потоке спасет ситуацию. У wadman 'а даже готовый прекрасный компонент есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 09:31:38 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
svnvlad Код: pascal 1. 2. При чем тут PostMessage - не понятно. Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 09:51:59 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
YuRockПри чем тут PostMessage - не понятно. Оно нафик не надо, но отработает, лабель покажет. Но таки да, перректально. LSVИ где после LabelWait.Visible := true LabelWait.Refresh ?YuRock Код: pascal 1. 2. При вынесении архивации в доп. поток не нужно ни то, ни другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 10:39:50 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
_Navy_При вынесении архивации в доп. поток не нужно ни то, ни другоеТС ни слова не спрашивал про потоки (может они и не подпрыгнули в этой задаче), а его засыпали, как обычно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 10:42:31 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
правильный подход ессно пустить поток и задизаблить кнопку при возврате поток ее отменит обратно. если нужен прогресс, то (самое простое решение) передаем в поток ссылку на прогресс-бар и дергаем ее желательно не очень часто через Synchronize ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 10:52:44 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
krapotkinчерез SynchronizeВот тут уж тогда лучше через PostMessage. Зачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 11:24:01 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
krapotkinесли нужен прогресс, то (самое простое решение) передаем в поток ссылку на прогресс-бар и дергаем ее желательно не очень часто через Synchronizeдля прогресса StaticQueue может оказаться главнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 12:00:06 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
YuRockЗачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.А зачем приучать к велосипедостроению, вместо того, чтобы использовать специально предоставленный механизм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 12:50:52 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
white_niggerYuRockЗачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.А зачем приучать к велосипедостроению, вместо того, чтобы использовать специально предоставленный механизм?Т.к. этот специальный механизм не всегда работоспособен, не говоря уже о его тормознутости и ограниченности. Обсуждалось уже много раз, снова не хочется. Про какие велосипеды ты говоришь - не совсем понятно только. Работа с окнами идет через сообщения, посылаемые ф-циями Send/PostMessage. Синхронизация между потоками достигается логикой архитектуры программы и, если надо, объектами синхронизации. Всё, точка. Никак не кривыми костылями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 13:28:22 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
white_niggerYuRockЗачем к кривой технологии приучать, чтобы потом грабли разгребать и в итоге уходить от Synchronize.А зачем приучать к велосипедостроению, вместо того, чтобы использовать специально предоставленный механизм? О каком специально предоставленном механизме идет речь? Synchronize или PostMessage? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 13:32:35 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
wadmanО каком специально предоставленном механизме идет речь? Synchronize или PostMessage?Про Queue. Быстро и кросплатформенно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 13:51:18 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
YuRock.к. этот специальный механизм не всегда работоспособен, не говоря уже о его тормознутости и ограниченности. Обсуждалось уже много раз, снова не хочется. Про какие велосипеды ты говоришь - не совсем понятно только. Работа с окнами идет через сообщения, посылаемые ф-циями Send/PostMessage. Синхронизация между потоками достигается логикой архитектуры программы и, если надо, объектами синхронизации. Всё, точка. Никак не кривыми костылями.Если ты не умеешь готовить кошек - это не значит что они невкусные. Подтяни матчасть по TThread, там не только Synchronize. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 13:59:20 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
А уж обновить Label - тут ТС и Synchronize за глаза хватило бы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 14:02:58 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
помнится до 6-й версии Synchronize как раз юзал sendmessage но с той поры благополучно отказался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 14:05:22 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
vavanпомнится до 6-й версии Synchronize как раз юзал sendmessage но с той поры благополучно отказалсяЯ уже не помню таких подробностей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 14:14:56 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
> помнится до 6-й версии Synchronize как раз юзал sendmessage но с той поры благополучно отказался подтверждаю. в 5-ке: [src=delphi]procedure TThread.Synchronize(Method: TThreadMethod); begin FSynchronizeException := nil; FMethod := Method; SendMessage(ThreadWindow, CM_EXECPROC, 0, Longint(Self)); if Assigned(FSynchronizeException) then raise FSynchronizeException; end;[/src] Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 14:17:21 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
История такова: у меня была одна программа, использующая асинхронные сокеты, и в ней я благополучно решал проблему с помощью PostMessage. Сейчас уже не помню почему, но помню, что читал, что вместо Thread-ов и Synchronize рекомендовалось там как раз использовать PostMessage. Может быть неправильно понял, и от Thread-ов не надо отказываться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 15:41:49 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
svnvladИстория такова: у меня была одна программа, использующая асинхронные сокеты, и в ней я благополучно решал проблему с помощью PostMessage. Сейчас уже не помню почему, но помню, что читал, что вместо Thread-ов и Synchronize рекомендовалось там как раз использовать PostMessage. Может быть неправильно понял, и от Thread-ов не надо отказываться.В каждом случае нужно смотреть, что использовать. Создание thread-ов относительно небыстрая задача для оси. Быстрее будет использование системного пула потоков (а-ля QueueUserWorkItem и иже с ними). Я это использовал в наших продуктах для сортировки и фильтрации. Причем перформанс заметен даже на относительно небольших данных. Если бы делал через TThread - то поднятие и инициализации съели бы немало полезного времени ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 16:14:49 |
|
||
|
Как с помощью Post-сообщений заставить программу отображать надписи.
|
|||
|---|---|---|---|
|
#18+
white_niggerБыстрее будет использование системного пула потоков (а-ля QueueUserWorkItem и иже с ними). А пример не покажете, что за системный пул потоков и как с ним работать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 16:47:26 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39534429&tid=2041727]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
163ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 442ms |

| 0 / 0 |
