|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
Не выполняется Thread в юните без форменной программы
Собственно вот в чём заморочка.
Создал проэкт программы, в которой не используются формы (тобишь без оконное приложение) и удалил Form из Uses. Далее объявил класс потока в юните таким образом. Код:
unit ServerTCP; interface Uses Classes, Sockets, Dialogs; Type TCPServerTCP = Class(TThread) Protected Procedure Execute; Override; Private Public End; type IPData = packed record LocalDomainName: WideString; LocalHostAddr: WideString; LocalHostName: WideString; LocalHost: WideString; LocalPort: WideString; BytesReceived: Integer; BytesSent: Integer; end; implementation { TCPServerTCP } procedure TCPServerTCP.Execute; var IP: TIPSocket; IPInfo: IPData; begin ShowMessage('Thread is work'); Try IP := TIPSocket.Create(nil); IPInfo.LocalHost := IP.LocalHost; IPInfo.LocalPort := IP.LocalPort; Finally IP.Free; End; while Not Terminated do Begin End; end; end. В основной программе подключил юнит. Объявил переменную. Код:
Uses ServerTCP in 'ServerTCP.pas';{Все подключаемые модули приводить не стану.} var Server: TThread; Далее создаю поток в программе. Код:
if (Server = Nil) then Begin Server := TCPServerTCP.Create(False){Не важно что здесь стоит, True с последующим Server.Resume; ли только False}; DataSend := 'Server to started.'; for I := 1 to LenGth(DataSend) do Data[i-1] := Byte(MidStr(DataSend,i,1)[1]); SendToIP(Data, LenGth(DataSend),string(inet_ntoa(from.sin_addr))); End; Дык вот, так же не имеет значения сколько основная программа будет работать, сообщение 'Thread is work' не появится до тех пор, пока не вызову завершение потока вот так. Код:
If Not (Server = Nil) then Begin Server.Terminate; Server.Free; DataSend := 'Server to stopped.'; for I := 1 to LenGth(DataSend) do Data[i-1] := Byte(MidStr(DataSend,i,1)[1]); SendToIP(Data, LenGth(DataSend),string(inet_ntoa(from.sin_addr))); End; В чём беда ? Читал где то что вот якобы поток выполняется определённый системой квант времени. Но как этот квант ему дать ? Ни кто не работал с потоками в программе без использования TForm ? Последний раз редактировалось seeman_tm, 08.02.2013 в 03:23. |
#2
|
||||
|
||||
Бряк на begin в execute поставь и посмотри, попадает туда или нет.
Так-то вроде не видно ошибок . — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
Цитата:
Не могу догнать, на какой бегин и чё поставить ? Вообще то прога работает, она у меня принимает юдп пакеты, делает определённые действия и отправляет ответ о ходе выполненных действиях, в частности то что "поток будущего TCP сервера создан", "его айпи такой то", "поток будущего TCP сервера завершен" и так же откликается на завершение вообще всей программы. Загвоздка в другом, процедура Execute у потока не выводит сообщение о том что он работает после его создания, пока не сделаешь вызов Server.Terminate. Что самое интересное, так это то, что если в код программы поставить {$APPTYPE CONSOLE} то и поток начинает работать сразу после его создания, только вот чёрное окно MSDos'a ни к чему. Могу выложить полный код программы и модуля если надо, секрета тут нет. Последний раз редактировалось seeman_tm, 08.02.2013 в 08:59. |
#4
|
||||
|
||||
Код:
procedure TCPServerTCP.Execute; var IP: TIPSocket; IPInfo: IPData; begin <<< вот сюда точку останова (клавиша F5), запустись по F9 и подожди, когда сюда отладчик прыгнет ShowMessage('Thread is work'); — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
||||
|
||||
не надо не в VCL приложении использовать TThread и VCL диалоги.
Код:
program Project1; uses Windows, Messages; function ThreadProc(Thread: Pointer): Integer; begin Result:=0; Windows.Beep(1000, 100); MessageBox(0, 'MessageBox', 'ThreadProc', MB_OK); EndThread(0); end; var FHandle: THandle; FThreadID: THandle; begin FHandle := BeginThread(nil, 0, @ThreadProc, nil, 0, FThreadID); WaitForSingleObject(FHandle, INFINITE); CloseHandle(FHandle); end. Пишу программы за еду. __________________ |
#6
|
||||
|
||||
NumLock, поменял ShowMessage на MessageBox в юните unit ServerTCP;
и всё заработало как было задумано. Можешь объяснить такую штуку ? Почему Цитата:
|