Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
ВнизНе получается вставить в поток небольшую (длительную) процедуру. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.097 c