Вверх ↑
Ответов: 4629
Рейтинг: 749
#1: 2014-07-07 13:15:19 ЛС | профиль | цитата
Galkov писал(а):
то значит у нас есть уже хотя бы один

В случае консольного мультипоточного приложения этот поток после запуска полезной работы в параллельных потоках ставится на паузу, чтобы не дать закрыться программе, пока не отработают полезные потоки. А вот регулирование взаимодействия полезных потоков - задача программиста (как и в визуальных приложениях). Метод Synchronize - один из вариантов, и то не самый оптимальный.

Про причины создания консольных приложений - без понятия.

------------ Дoбавленo в 13.15:

Пример консольного MailSlot - сервера: mailslot console server.sha
Пример клиента: mailslot client.sha
Попробуйте поотправлять данные серверу: вы ничего не увидите, так как сервер не работает в консольном приложении.
Внесите следующую поправку в файле hiMailSlot_Server.pas (в процедуре THIMailSlot_Server._OnExec):

#pas
function THIMailSlot_Server._OnExec;
var nBytesRead:cardinal;
begin
while not Sender.Terminated do begin
if ReadFile(ms, str[1], MAXWORD, nBytesRead, nil) then begin
SetLength(str,nBytesRead);
if Applet <> nil then
Sender.Synchronize(SyncExec)
else
SyncExec;
SetLength(str,MAXWORD);
end;
end;
Result := 0;
end;
Сервер заработает.
В консольном примере работает 3 потока. Проблем не заметил (что не отменяет вышеизложенных соображений по работе с потоками в более сложных схемах)

[offtop]PS: отдельно зацените "удобство" метода doCreate в компоненте Events[/offtop]

карма: 26

0