![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |