|
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 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Нет, надо таки прочитать документацию как всей этой машинерией пользоваться правильно. Выше уже цитировали кусок. PS: Хотя на мой вкус проще выкинуть всю эту индюшатину в полном составе. Ушел от инди где мог, по сокетам ничего не нашел... :( Как можно и в этом вопросе избавиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 04:53 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov ъъъъъPostMessage(Self.Handle, WM_STRPROCESS, WPARAM(Pointer(fStr)), 0); С PostMessage так нельзя: до главного потока долетит ссылка на мусор от которого тому поплохеет. С SendMessage - можно. Сделал ч-з SendMessage, работает отлично, но инди ещё преподнесли геморроя... При отключении сервера с подключенными клиентами , выходит ошибка raised exception class EIdClosedSocket with message 'Disconnected.'. и способа корректно "отрубить" всех клиентов я не нашёл... Какая-то муйня ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 06:51 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
antox Ушел от инди где мог, по сокетам ничего не нашел... :( Прям стало интересно, где же ты все-таки ушел от Инди, если это либа сетевых компонентов ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 10:27 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
По коду от ъъъъъ: вариант костыльно-хакерский, конечно, его надо обкладывать комментами и проверками. Либо сделать более корректно через NewStr/DisposeStr. И указатели традиционно отсылаются в LPARAM (хоть с w32 они и сравнялись в размерах с WPARAM). И еще я бы добавил $IF проверку по Sizeof - она есть не просит, зато сразу ругнется, если вдруг код окажется на платформе, где размеры не совпадают ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 10:38 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal И еще я бы добавил $IF проверку по Sizeof - она есть не просит, зато сразу ругнется, если вдруг код окажется на платформе, где размеры не совпадают А вот хакерство мне да, сильно не нравится. Кстати, там будет утечка памяти, всего лишь если PostMessage вернёт False. Надо хотя бы на результат проверять перед этим хаком (который, кстати, в следующих версиях дельфей вполне может перестать работать, в отличие от изменения параметров PostMessage). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 11:42 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
antox Dimitry Sibiryakov Нет, надо таки прочитать документацию как всей этой машинерией пользоваться правильно. Выше уже цитировали кусок. PS: Хотя на мой вкус проще выкинуть всю эту индюшатину в полном составе. Ушел от инди где мог, по сокетам ничего не нашел... :( Как можно и в этом вопросе избавиться? А книжку кто-то раньше тебя скачал, теперь там её нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 11:43 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
antox ... При отключении сервера с подключенными клиентами , выходит ошибка raised exception class EIdClosedSocket with message 'Disconnected.'. и способа корректно "отрубить" всех клиентов я не нашёл... Какая-то муйня Код: pascal 1.
- при этом для каждого соединения вызовется CloseSocket, т.к. Код: pascal 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 12:08 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
ъъъъъ ну, теоретически... если сообщение как-то потеряется, то вот вам и утечка. :) Dimitry Sibiryakov Например, когда sizeof(WPARAM) <> sizeof(LPARAM) <> sizeof(Pointer). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 13:35 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
YuRock Сомневаюсь, что когда-нибудь появится новая винда, в которой будет sizeof(LPARAM) <> sizeof(LPARAM) или <> sizeof(Pointer). А вот хакерство мне да, сильно не нравится. Кстати, там будет утечка памяти, всего лишь если PostMessage вернёт False. Надо хотя бы на результат проверять перед этим хаком (который, кстати, в следующих версиях дельфей вполне может перестать работать, в отличие от изменения параметров PostMessage). Мало ли... как я говорил, проверка есть не просит и даже код не замедляет. PostMessage вернёт False, если очередь заполнится, а это по умолчанию 10к мессаг в очереди. Проверка бесспорно нужна, но это скорее нештатный случай для главного потока. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 15:48 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal antox Ушел от инди где мог, по сокетам ничего не нашел... :( Прям стало интересно, где же ты все-таки ушел от Инди, если это либа сетевых компонентов TNetHTTPClient - очень понравилось :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 16:07 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
s62 antox ... При отключении сервера с подключенными клиентами , выходит ошибка raised exception class EIdClosedSocket with message 'Disconnected.'. и способа корректно "отрубить" всех клиентов я не нашёл... Какая-то муйня Код: pascal 1.
- при этом для каждого соединения вызовется CloseSocket, т.к. Код: pascal 1. 2. 3. 4. 5. 6. 7.
Может перед Код: pascal 1.
надо еще что-то вызвать? А то AV ловится Код: pascal 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 16:24 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Пока удалось решить ч-з try, но не нравится, в отладке всё равно дает ошибку Код: pascal 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 16:48 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
ъъъъъ antox пропущено... Ушел от инди где мог, по сокетам ничего не нашел... :( Как можно и в этом вопросе избавиться? А книжку кто-то раньше тебя скачал, теперь там её нет? Есть :) Там ооочень много инфы, пока не нашел по сокетам ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 16:57 |
|
TIdTCPServer.OnExecute & TQueue
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal проверка есть не просит и даже код не замедляет. Fr0sT-Brutal 10к мессаг в очереди. Проверка бесспорно нужна, но это скорее нештатный случай для главного потока. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2021, 17:23 |
|
|
start [/forum/topic.php?all=1&fid=58&tid=2036889]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 162ms |
0 / 0 |