|
|
Регистрация | << Правила форума >> | 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. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |