Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.12.2019, 03:34
usfire usfire вне форума
Прохожий
 
Регистрация: 25.02.2016
Сообщения: 13
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию многопоточность : обьеденить две программы

https://drive.google.com/open?id=1DG...wn0bwuU3TL6vMR

https://drive.google.com/open?id=1vs...iCun2IH2ZOhw4q

Код:
unit Unit1;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WinSock, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

type 
     ip_option_information = packed record  // Информация заголовка IP (Наполнение 
                     // этой структуры и формат полей описан в RFC791. 
         Ttl : byte;         // Время жизни (используется traceroute-ом) 
         Tos : byte;         // Тип обслуживания, обычно 0 
         Flags : byte;       // Флаги заголовка IP, обычно 0
         OptionsSize : byte;     // Размер данных в заголовке, обычно 0, максимум 40 
         OptionsData : Pointer;  // Указатель на данные 
     end; 

    icmp_echo_reply = packed record 
         Address : u_long;            // Адрес отвечающего 
         Status : u_long;             // IP_STATUS (см. ниже) 
         RTTime : u_long;             // Время между эхо-запросом и эхо-ответом 
                          // в миллисекундах 
         DataSize : u_short;              // Размер возвращенных данных 
         Reserved : u_short;              // Зарезервировано 
         Data : Pointer;          // Указатель на возвращенные данные 
         Options : ip_option_information; // Информация из заголовка IP 
     end; 

     PIPINFO = ^ip_option_information; 
     PVOID = Pointer; 

         function IcmpCreateFile() : THandle; stdcall; external 'ICMP.DLL' name 'IcmpCreateFile'; 
         function IcmpCloseHandle(IcmpHandle : THandle) : BOOL; stdcall; external 'ICMP.DLL'  name 'IcmpCloseHandle'; 
         function IcmpSendEcho( 
                           IcmpHandle : THandle;    // handle, возвращенный IcmpCreateFile() 
                           DestAddress : u_long;    // Адрес получателя (в сетевом порядке) 
                           RequestData : PVOID;     // Указатель на посылаемые данные 
                           RequestSize : Word;      // Размер посылаемых данных 
                           RequestOptns : PIPINFO;  // Указатель на посылаемую структуру 
                                                // ip_option_information (может быть nil) 
                           ReplyBuffer : PVOID;     // Указатель на буфер, содержащий ответы. 
                           ReplySize : DWORD;       // Размер буфера ответов 
                           Timeout : DWORD          // Время ожидания ответа в миллисекундах
                          ) : DWORD; stdcall; external 'ICMP.DLL' name 'IcmpSendEcho';  

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var 
     hIP : THandle; 
     pingBuffer : array [0..31] of Char; 
     pIpe : ^icmp_echo_reply; 
     pHostEn : PHostEnt; 
     wVersionRequested : WORD; 
     lwsaData : WSAData; 
     error : DWORD; 
     destAddress : In_Addr; 
 begin 
     
     // Создаем handle 
     hIP := IcmpCreateFile(); 
     
     GetMem( pIpe, 
             sizeof(icmp_echo_reply) + sizeof(pingBuffer)); 
     pIpe.Data := @pingBuffer; 
     pIpe.DataSize := sizeof(pingBuffer); 

     wVersionRequested := MakeWord(1,1); 
     error := WSAStartup(wVersionRequested,lwsaData); 
     if (error <> 0) then 
     begin 
          Memo1.SetTextBuf('Error in call to '+'WSAStartup().');
          Memo1.Lines.Add('Error code: '+IntToStr(error));
          Exit; 
     end; 
     
     pHostEn := gethostbyname('ya.ru'); 
     error := GetLastError(); 
     if (error <> 0) then 
     begin 
          Memo1.SetTextBuf('Error in call to'+ 
                           'gethostbyname().'); 
          Memo1.Lines.Add('Error code: '+IntToStr(error)); 
          Exit; 
     end; 
       
      destAddress := PInAddr(pHostEn^.h_addr_list^)^; 

       // Посылаем ping-пакет 
     Memo1.Lines.Add('Pinging ' + 
                     pHostEn^.h_name+' ['+ 
                     inet_ntoa(destAddress)+'] '+ 
                     ' with '+ 
                     IntToStr(sizeof(pingBuffer)) + 
                     ' bytes of data:'); 

     IcmpSendEcho(hIP, 
                  destAddress.S_addr, 
                  @pingBuffer, 
                  sizeof(pingBuffer), 
                  Nil, 
                  pIpe, 
                  sizeof(icmp_echo_reply) + sizeof(pingBuffer), 
                  5000); 

     error := GetLastError(); 
     if (error <> 0) then 
     begin 
          Memo1.SetTextBuf('Error in call to '+ 
                           'IcmpSendEcho()'); 
          Memo1.Lines.Add('Error code: '+IntToStr(error)); 
          Exit; 
     end; 

      // Смотрим некоторые из вернувшихся данных 
     Memo1.Lines.Add('Reply from '+ 
                 IntToStr(LoByte(LoWord(pIpe^.Address)))+'.'+ 
                 IntToStr(HiByte(LoWord(pIpe^.Address)))+'.'+ 
                 IntToStr(LoByte(HiWord(pIpe^.Address)))+'.'+ 
                 IntToStr(HiByte(HiWord(pIpe^.Address)))); 
     Memo1.Lines.Add('Reply time: '+IntToStr(pIpe.RTTime)+' ms'); 

     IcmpCloseHandle(hIP); 
     WSACleanup(); 
     FreeMem(pIpe);
end;

end.


Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, ComCtrls,WinSock;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;

    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
potok = class(TThread) //Этой строкой мы унаследовали класс потока
  private
   str: string;//в разделе private описываются переменные с помощью которых мы
   nomer : Integer;//будем передавать значения между процедурами внутри потока
  protected
    procedure Execute; override;//это главная процедура потока, она начинает свою работу
//после того как мы создали поток
  public
    procedure synchro;//в разделе public вы можете объявить процедуры какие только душе
//угодно
    constructor Create(CreateSuspended: Boolean);//эта строка говорит о том, что мы в
//implementation опишем конструкцию
//потока
  end;

var
a: array [1..10] of potok;
  Form1: TForm1;
   nom:integer;
implementation
constructor potok.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);//Эта строка говорит о том, что поток после создания
//будет приостановлен если ему передать значение true при создание, если false, то сразу
//начнёт работу.
end;
{$R *.dfm}
type
    ip_option_information = packed record  // Информация заголовка IP (Наполнение 				    // этой структуры и формат полей описан в RFC791.
        Ttl : byte;			// Время жизни (используется traceroute-ом)	
        Tos : byte;			// Тип обслуживания, обычно 0
        Flags : byte;		// Флаги заголовка IP, обычно 0
        OptionsSize : byte;		// Размер данных в заголовке, обычно 0, максимум 40
        OptionsData : Pointer;	// Указатель на данные 
    end;

   icmp_echo_reply = packed record
        Address : u_long; 	    	 // Адрес отвечающего
        Status : u_long;	    	 // IP_STATUS (см. ниже)
        RTTime : u_long;	    	 // Время между эхо-запросом и эхо-ответом 
				         // в миллисекундах
        DataSize : u_short; 	    	 // Размер возвращенных данных
        Reserved : u_short; 	    	 // Зарезервировано
        Data : Pointer; 		 // Указатель на возвращенные данные
        Options : ip_option_information; // Информация из заголовка IP
    end;

    PIPINFO = ^ip_option_information;
    PVOID = Pointer;

        function IcmpCreateFile() : THandle; stdcall; external 'ICMP.DLL' name 'IcmpCreateFile';
        function IcmpCloseHandle(IcmpHandle : THandle) : BOOL; stdcall; external 'ICMP.DLL'  name 'IcmpCloseHandle';
        function IcmpSendEcho(// handle, возвращенный IcmpCreateFile()
                          DestAddress : u_long;    
                          RequestData : PVOID;    
                          RequestSize : Word;      // Размер посылаемых данных
                          RequestOptns : PIPINFO;  // Указатель на посылаемую структуру 
                       		                   // ip_option_information (может быть nil)
                          ReplyBuffer : PVOID;     // Указатель на буфер, содержащий ответы.
                          ReplySize : DWORD;       // Размер буфера ответов 
                          Timeout : DWORD          // Время ожидания ответа в миллисекундах
                         ) : DWORD; stdcall; external 'ICMP.DLL' name 'IcmpSendEcho';


procedure TForm1.Button1Click(Sender: TObject);
var
pot:integer;
begin
for pot:=1  to 10 do  //цикл запускает 10 потоков, которые будут изменять заголовок
  a[pot]:=potok.Create(false); //формы, так же идёт добавление в массив, что бы потом вы могли их уничтожить по одному.

 //  Ping('127.0.0.1', Memo1);
  end;

procedure potok.Execute;//начинаем описывать главную процедуру потока
var
I:integer;
begin
for i:=0 to 100 do
begin
sleep(1000);
synchronize(synchro);//этой строкой мы вызываем процедуру synchro в единичном экземпляре
end;
end;

procedure potok.synchro; //описываем ещё одну процедуру потока, которая будет менять
//загаловок form1
begin
inc(nom);
//form1.Caption:=' '+inttostr(nom);

//Form1.Memo1.Lines.Add(inttostr(nom));

// Ping(form1.memo2.lines.strings[0], form1.Memo1);

end;


end.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2020

ВКонтакте   Facebook   Twitter