![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Собственно вот в чём заморочка.
Создал проэкт программы, в которой не используются формы (тобишь без оконное приложение) и удалил 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 поставь и посмотри, попадает туда или нет.
Так-то вроде не видно ошибок . |
|
#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'); |
|
#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;
и всё заработало как было задумано. Можешь объяснить такую штуку ? Почему Цитата:
|