![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Собственно есть функция которая должна вернуть некий результат, но функция оставляет параметры в массив, и поток раз в секунду проверяет массив на наличие элементов (своеобразный стек) и выполняет запрос на сервер, полученный результат надо вернуть в ту же функцию, как? 
		
	
		
		
		
		
		
	
		
		
	
	
	там идет именно функция, ибо так удобней, Есть мысль передать адрес функции в тот же массив и заставить приложение ждать результата, и потом вернуть на адрес результат, но не умею, подскажите  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Код из демо приложения 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	procedure TForm1.btn2Click(Sender: TObject);
var
  s:string;
begin
  s:=vk.GetUserName('41891803');  // - собсн функция
  showmessage('Его зовут '+s);
end;Код компонента Код: 
	function TVkClient.GetUserName(user_id: string;last_name:boolean=false): string; begin // Добавляются параметры в record и в общую кучу, //надо как то заставить приложение ждать результата end; Код: 
	procedure TVKTHR.execute; begin // код потока, он выполнил запрос из первого элемента массива, получил результат // теперь надо вернуть обратно в функцию end;  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Значит должен быть еще один "стек", в который уже будет писать результат поток (нить), а фунция будет от туда читать. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 ну, как вариант, добавлять в массив помимо параметров для потока еще и указатель, куда поток будет сохранять результат (естественно функция выделяет память) и хэндл Event'а, который поток будет устанавливать в сигнальное состояние, когда выполнит запрос, а функция ожидать этот Event. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	либо функция сама запускает свой поток и ждет его завершения. но не понятно зачем вообще потоки? функция все-равно "зависнет".  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Ну а так не устроит? 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	unit Unit27;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
type
  TLoginInfo = class
   Name, Password: String;
  end;
  TForm27 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    Logins: Array of TLoginInfo;
  end;
  TLogin = class(TThread)
   Login: TLoginInfo;
   constructor Create(Login: TLoginInfo);
   procedure Execute; override;
  end;
var
  Form27: TForm27;
implementation
Uses DBLogDlg;
{$R *.dfm}
procedure TForm27.Button1Click(Sender: TObject);
begin
 SetLength(Logins, Length(Logins) + 1);
 Logins[High(Logins)] := TLoginInfo.Create;
 with TLogin.Create(Logins[High(Logins)]) do Resume;
end;
{ TLogin }
constructor TLogin.Create(Login: TLoginInfo);
begin
 inherited Create(False);
 Self.Login := Login;
end;
procedure TLogin.Execute;
begin
 inherited;
 LoginDialog('Login', Login.Name, Login.Password)
end;
procedure TForm27.Timer1Timer(Sender: TObject);
Var i: Integer;
begin
 Memo1.Clear;
 for i := 0 to Length(Logins) - 1
 do Memo1.Lines.Add(Format('Name: %s Password: %s', [Logins[i].Name, Logins[i].Password]));
end;
end. |