Показать сообщение отдельно
  #1  
Старый 08.02.2013, 00:28
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию Не выполняется 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 ?
Ответить с цитированием