|
|
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги! Есть поток, который берет данные из базы и форма, которая должна принимать эти данные. глобальный тип Код: pascal 1. 2. 3. 4. 5. Ранее поток писал в TList, а форма считывала из него по таймеру. Код: 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. 29. 30. 31. 32. 33. 34. 35. Задумав избавиться от Timer реализовал CallBack функцию, но получается что она работает асинхронно и часть данных теряется, т.е. приходит мусор. Код: 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. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. Форма Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Не могли бы вы подсказать, как реализовать данное решение правильно? Может CallBack и не подходит вовсе... Или надо сначала получить все данные, а потом их в Callback заслать массивом? Спасибо за разъяснения! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 16:55 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Отбой, надо было читать больше и глубже :) Решение Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Решение не претендует на идеальность, но требуемое достигнуто. Хотя хотелось бы также выслучашь и ваше мнение, т.к. вопрос мне интересен. PS. Жалко нельзя свои же темы удалять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 17:09 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Kast2K, передавай из потока сообщения главному окну. Можно как синхронно, так и асинхронно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 17:09 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис, О WM_Copydata я тоже думал, но захотел попробовать так для начала :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 17:11 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Kast2K, WM_CopyData нужен для обмена данными между разными процессами. Просто сделай custom-сообщение (WM_USER+xxx) и отправляй из потока. Synchronize - не лучшее решение, если главный поток чем-то занят, дополнительный будет ждать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 17:18 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
+1 к предложению использовать сообщения. И можно сразу ссылку на данные передавать, никакой синхронизации не потребуется, только не забывать ресурсы (блок данных или объект) освобождать на стороне приема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 17:31 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Соколинский БорисПросто сделай custom-сообщение (WM_USER+xxx) и отправляй из потока. Synchronize - не лучшее решение, если главный поток чем-то занят, дополнительный будет ждать. Вот тут мне любопытно, на какие из двух граблей аффтар наступит: 1) Будет посылать SendMessage в главный поток, который чем-то занят (что само по себе плохой дизайн ибо единственное, чем должен быть занять главный поток это как раз обработка сообщений); 2) Будет посылать PostMessage, но, будучи не в курсе управления памятью, будет ловить ошибки обращения к уже освобождённой памяти и/или "мусор". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 17:32 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovединственное, чем должен быть занять главный поток это как раз обработка... Вот он как раз и может быть занят обработкой сообщений. А обработка может быть длительной. Dimitry Sibiryakov2) Будет посылать PostMessage, но, будучи не в курсе управления памятью, будет ловить ошибки обращения к уже освобождённой памяти и/или "мусор". Мы ему поможем - расскажем о SendMessageCallback. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 18:17 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Соколинский БорисА обработка может быть длительной. Может в неправильных руках. Но не должна. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 18:29 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovМожет в неправильных руках. Но не должна. Не согласен. Все, что связано с отрисовкой может быть длительным. А вне основного потока, в силу особенностей реализации дельфей будет очень глюкаво. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 18:39 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис Не согласен. Все, что связано с отрисовкой может быть длительным. А вне основного потока, в силу особенностей реализации дельфей будет очень глюкаво. А не надо блокировать объект (или стэк), откуда берешь данные для отрисовки, на всё время отрисовки. Заблокировал объект, чтобы туда никто ничего не писал, считал данные, дальше разблокируй объект и рисуй себе эти данные сколько угодно. Объект( или стэк) же будет в это время заполняться новыми данными. Хотя, я предпочел postmessage. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 22:55 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
А можно в TThreadList поместить данные И отправить тем же PostMessage'ем сообщение с индексом в списке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2018, 23:31 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис Мы ему поможем - расскажем о SendMessageCallback. Решил поэкспериментировать, но что-то идет не так. реализовал процедуру обратного вызова на основании http://winapi.freetechsecrets.com/win32/WIN32SendAsyncProc.htm Код: pascal 1. создал сообщение WM_USER+1024; пытаюсь скопмилировать и получаю ошибку Код: pascal 1. 2. 3. 4. 5. 6. В книге (правда устаревшей уже) указано также https://ru.scribd.com/doc/53597660/The-Tomes-of-Delphi-Win32-Core-API-Windows-2000-Edition ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 09:57 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Да и микрософт говорит, что данная функция не должна ничего возвращать Return Value This callback function does not return a value. https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nc-winuser-sendasyncproc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 10:10 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Кроме сообщений можно ещё событие (Event) выставлять. Установлено событие - есть новые данные. Считал данные, сбросил событие. Уснул до нового события. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 11:07 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
DimonkaКроме сообщений можно ещё событие (Event) выставлять. Установлено событие - есть новые данные. Считал данные, сбросил событие. Уснул до нового события. Это в поток, а не из него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 11:28 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
C ошибкой разобрался - процедуру изначально засунул в private и компилятор ругался. SendMessageCallBack работает, данные приходят, но в процедуру SMCB ничего не возвращается, т.к. она в потоке. Спасибо за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 11:43 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Kast2KSendMessageCallBack работает, данные приходят, но в процедуру SMCB ничего не возвращается, т.к. она в потоке. Это неважно. СallBack будет обработан если в потоке будет запускаться проверка сообщений. GetMessage() вставляй периодически. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 17:23 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Соколинский БорисСallBack будет обработан если в потоке будет запускаться проверка сообщений. GetMessage() вставляй периодически. Ну и назачем эти прыжки в ширину, если результат можно прямо вернуть при вызове SendMessage?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 17:45 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, предлагаю обмен очевидными репликами пропустить, никакого конструктива из этой дискуссии не выйдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2018, 18:10 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис GetMessage() вставляй периодически. Спасибо за подсказку! Решилось Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 07:46 |
|
||
|
Callback из потока
|
|||
|---|---|---|---|
|
#18+
Kast2KСоколинский Борис GetMessage() вставляй периодически. Спасибо за подсказку! Решилось Код: pascal 1. 2. 3. 4. 5. 6. 7. Странный подход, ну да ладно. А чем элементарная реакция на сообщение не устраивает? Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2018, 12:47 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39711603&tid=2040332]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
192ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 502ms |

| 0 / 0 |
