|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Запускаю сервер TIdTCPServer и отлавливаю на OnExecute входящее от клиента данные, всё нормально, но... Если в OnExecute принять данные от клиента и отправить их в функцию, которая вызывает, например, ShowMessge или ShowModal , то приложение зависает... Так работает нормально: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Так начинает виснуть: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Я так понимаю, что надо полученные данные в DoOnIndyExecute как-то ставить в очередь, а потом собирать из очереди в showForm или вообще не туда? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 16:51 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
antox, найди книжку Григтрьева "О чем не пишут в книжках по Дельфи", там tcp сервера руками реализуют, с подробными разъяснениями. Нафига тебе эти инди... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 17:04 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
"О чём не пишут в книгах по Delphi." А. Б. Григорьев ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 17:09 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
antox*ShowMessge *или *ShowModal*, то приложение зависает... Не зависает, а показывает диалог или форму и ждёт пока пользователь их закроет. Внезапно, но именно это и написано в справке по данным функциям. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 17:09 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
ъъъъъ "О чём не пишут в книгах по Delphi." А. Б. Григорьев Ага, нашел, почитаю... Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 17:14 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov antox*ShowMessge *или *ShowModal*, то приложение зависает... Не зависает, а показывает диалог или форму и ждёт пока пользователь их закроет. Внезапно, но именно это и написано в справке по данным функциям. После того, как закрываешь модальное окно, приложение не реагирует на клики мыши и клавиатуры, даже закрыть его не получается, но в диспетчере задач всё норм, приложение типа отвечает ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 17:16 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Вот поэтому-то их нельзя показывать из фоновых потоков (без основательных знаний). Отладчик в руки и смотри чем каждый из потоков после закрытия занят. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 17:22 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Вот поэтому-то их нельзя показывать из фоновых потоков (без основательных знаний). Отладчик в руки и смотри чем каждый из потоков после закрытия занят. Так-так.., а он в отдельном потоке OnExecute обрабатывает или это мне надо отдельный поток создавать? Я-то все в основном делаю ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 17:32 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
antoxа он в отдельном потоке OnExecute обрабатывает А вот это-то тебе и поможет выяснить отладчик. Если сумеешь научиться им пользоваться. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 17:37 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
antox Dimitry Sibiryakov Вот поэтому-то их нельзя показывать из фоновых потоков (без основательных знаний). Отладчик в руки и смотри чем каждый из потоков после закрытия занят. Так-так.., а он в отдельном потоке OnExecute обрабатывает или это мне надо отдельный поток создавать? Я-то все в основном делаю Из справки по TIdTCPServer.OnExecute Event OnExecute receives a TIdContext argument that represents the task for the client connection, and contains a TIdTCPConnection instance for the client connection, and the thread or fiber that controls execution of the task. A protected procedure in the server that triggers OnExecute is assigned to the TIdContext, and eventually the thread or fiber acquired from the Scheduler for the server. Из справки по TIdTCPServer TIdTCPServer allows multiple simultaneous client connections, and allocates a separate unit of execution for each client connecting to the server. Each client connection represents a task that is managed by the Scheduler for the server. Listener threads use the Scheduler to create an executable task for each client connection. The Scheduler handles creation, execution, and termination of tasks for client connections found in Contexts. The ContextClass property indicates the type of executable task created for client connections and added to Contexts. There are basically two types of Schedulers available for TIdTCPServer: Thread-based and Fiber-based. Each is designed to work with a specific type of executable task that represents the client connections. There are further Scheduler refinements that allow a pool of pre-allocated Threads, or Threads which perform scheduling for dependent Fibers. The default Scheduler implementation in TIdTCPServer uses a Thread to represent each client connection. Threads are a common feature found on all platforms and Operating Systems hosting the Indy library. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 17:45 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Похоже, отдельный поток, после входа в OnExecute, пробегает до конца, далее устанавливается на Код: pascal 1.
и ждет новых данных соответственно, если в OnExecute после AContext.Connection.Socket.ReadLn(IndyTextEncoding(IdTextEncodingType.encUTF8)); вызывается модальное окно, то тут и происходит затуп, выполнение останавливается вместо того, чтобы вернуться на Код: pascal 1.
и слушать дальше. Т.е. надо писать в глобальную переменную и хотя бы для начала по таймеру проверять s.length > 0 Код: pascal 1.
читать из переменной данные и задавать пустую строку s := ''; ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 18:21 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Нет, надо таки прочитать документацию как всей этой машинерией пользоваться правильно. Выше уже цитировали кусок. PS: Хотя на мой вкус проще выкинуть всю эту индюшатину в полном составе. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 18:24 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
antox, у тебя же компонент TIdTCPServer на формочке лежит? Если да - то добавь на форму обработчик сообщения WM_STRPROCESS: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
а из OnExecute не ShowMessage(строка) зови, а ShowStr(строка). Функцию ShowStr() определи тут же: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
:) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 18:33 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
ъъъъъPostMessage(Self.Handle, WM_STRPROCESS, WPARAM(Pointer(fStr)), 0); С PostMessage так нельзя: до главного потока долетит ссылка на мусор от которого тому поплохеет. С SendMessage - можно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 19:10 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, а строка-то в куче лежит. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 20:13 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
ъъъъъа строка-то в куче лежит. :) Да. И это место освобождается сразу после выхода из метода, где она объявлена. Что, неожиданно для нубов, случается ДО того, как сообщение дойдёт до главного потока. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 20:18 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov И это место освобождается сразу после выхода из метода, где она объявлена. Не. Код: pascal 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 20:30 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
ъъъъъ WPARAM(fStr) := 0; Прелестная утечка памяти. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 20:38 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, тебе сегодня не угодить. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 20:41 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
В любой день я буду ругаться на говнокод, который нубы будут копипастить в продакшен. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 20:45 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Прелестная утечка памяти. ъъъъъ Код: pascal 1.
ъъъъъ Код: pascal 1.
Я бы еще добавил Finalize в WMStrProcess. Просто чтобы работало всегда, а не до следующего изменения логики компилятора Код: pascal 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2021, 23:34 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
_Vasilisk_, ну, теоретически... если сообщение как-то потеряется, то вот вам и утечка. :) Можно придумать ситуацию, если очень хочется. ... Я данной схемой межнитевого взаимодействия пользуюсь, давно. Не нужно синхронизаций, просто и удобно. И, конечно, можно не только окну слать, а и в очередь треда, но с окном в дельфи обычно проще: окна почти всегда есть, и message - методы, для лентяев... :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 00:57 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
ъъъъъМожно придумать ситуацию, если очень хочется. Например, когда sizeof(WPARAM) <> sizeof(LPARAM) <> sizeof(Pointer). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 01:26 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, точно, в Win3.1 работать не будет! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 02:19 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
ъъъъъ antox, у тебя же компонент TIdTCPServer на формочке лежит? Если да - то добавь на форму обработчик сообщения WM_STRPROCESS: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
а из OnExecute не ShowMessage(строка) зови, а ShowStr(строка). Функцию ShowStr() определи тут же: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
:) Нет, без формы, создается динамически :( ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 04:51 |
|
|
start [/forum/topic.php?fid=58&fpage=8&tid=2036889]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 155ms |
0 / 0 |