Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.09;
Скачать: CL | DM;

Вниз

Не получается вставить в поток небольшую (длительную) процедуру.   Найти похожие ветки 

 
Yuraz ©   (2002-11-29 09:54) [0]

Уважаемые мастера, подскажите как данную процедуру оформить в отдельный поток (thread), делаю вторую неделю, ничего поделать не могу :( раньше никогда с потоками не сталкивался. Тут описал свою задачу, это простая программа отправки данных методом POST скрипту в интернете. В данном виде работает. На форме кнопка, поле Edit1, поле Memo1 для вывода результата. Только если произвожу отсылку через медленную линию, или прокси сервер, форма приложения напрочь вешается, до тех пор, пока не примется последний байт ответа.

сам код действия без потока:

//###########################################
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
st: TMemoryStream; //сюда поступает ответ от сервера
send:string; // отсылаемая строка
begin
st:=TMemoryStream.Create;
try
//поле, отправляемое по интернету
send:="mail" + "=" + Edit1.Text;
//отсылаем в скрипт, принимающий данные, пересылаемая строка, принимаем ответ в st
ProxyHTTPpostURL(" http://127.0.0.1/post838.php", send, st);
st.Seek(0,soFromBeginning);
//показываем результат в memo1
Memo1.Lines.LoadFromStream(st);
finally
st.Free;
end;
end;
//###########################################



с потоками я делаю по такому шаблону, создаю Unit2 (Unit1 ниже):



//###########################################
unit Unit2;

interface

uses
Classes, SysUtils;

type
TSendThread = class(TThread)
private
//
protected
procedure Execute; override;
procedure Priem; //приём данных
end;

implementation

{ TSendThread }

uses
Unit1;

procedure TSendThread.Priem;

begin
//
end;


procedure TSendThread.Execute;

begin
// ...
// ...
Synchronize (AddMemo);
end;

end.

.

//###########################################

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Unit2,
StdCtrls, ComCtrls, ExtCtrls;

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

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
ST := TSendThread.Create (False); // start
end;

//###########################################

в результате нечего не выходит, то при компиляции ругается, то в процессе выполнения, сейчас синтаксис вроде верный, как везде в статьях написанно. Главный вопрос, как разобраться, что писать в процедуру TSendThread.Execute, и что надо писать в процедуру, которую синхронизируем TSendThread.Priem в данном примере.
С уважением, Юрий.


 
Smithson ©   (2002-11-29 10:19) [1]

Ошибки здесь: Synchronize (AddMemo);
Пункт первый: Хто такой AddMemo()?
Пункт второй: Процедуры, вызванные через Synchronize, работают в основном потоке (но никак не в вызывающем), посему смысла в потоке нет.


 
Yuraz ©   (2002-11-29 11:09) [2]

Smithson © (29.11.02 10:19)
как тогда быть, если ответ идёт более 30 секунд, форма всё это время висит.


 
Yuraz ©   (2002-11-29 11:10) [3]

procedure TSendThread.Execute;

begin
// ...
// ...
Synchronize (Priem);
end;


 
Smithson ©   (2002-11-29 11:18) [4]

Синхронайз следует употреблять только для работ, связанных с обновлением VCL. RTFM же, блин! Читайте книжки!

procedure TSendThread.Execute;

begin
// ...
// ...
Priem();
end;


 
Yuraz ©   (2002-11-29 11:43) [5]

т.е. то что в SpeedButton1Click(Sender: TObject), кладу в Priem, а Priem вызываю в Execute, и в Memo1 строки будут добавлятся по мере поступления, не вешая форму ? ? ?
Хорошо, спасибо Smithson, у меня комп дома, оттестирую. Книги читаю, но мелочь не могу сделать, может хоть сейчас что то прояснится.



Страницы: 1 вся ветка

Текущий архив: 2002.12.09;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
3-27882
DmitryMN
2002-11-21 14:41
2002.12.09
Сжатие InterBase


1-28114
DVM
2002-11-28 15:45
2002.12.09
Как узнать, что кнопку мыши в ListView нажали над значком?


7-28303
der
2002-10-08 19:19
2002.12.09
управление порядком загрузки при включении


1-28101
Начинающий програмер
2002-11-27 16:13
2002.12.09
Интеграция в Винды


14-28298
TTCustomDelphiMaster
2002-11-19 21:03
2002.12.09
Кто нибудь играл на Нью-Йоркской фондовой бирже?