![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
NMStrm+клиент/сервер
kostik78ua © (2002-07-31 14:53:00)У меня загадка природы!
Есть приложение-клиент и приложение-сервер. Надо переслать с сервера на клиент файл. Использую TNMStrm и TNMStrmServ.
На сервере ставлю кнопку с обработчиком:
var
stm: TMemoryStream;
begin
stm := TMemoryStream.Create;
try
stm.LoadFromFile("c:\somefile.exe");
NMStrm1.PostIt(stm);
finally
stm.Free;
end;
end;
На клиенте все работает классно. Но когда я создаю метод интерфейса:
procedure TRDMServ.SendData;
begin
Form1.Button1.Click;
end;
То на PostIt - подвисает.
То есть когда вручную кликаешь на кнопку - работает, а с клиента вызываешь Click - не работает.
Кто может сказать - ПОЧЕМУ ???
kostik78ua (2002-08-01 11:25:00) [1]На PostIt виснет
Digitman (2002-08-01 10:39:00) [2]Для начала скажи - что не работает
kostik78ua (2002-08-01 10:33:00) [3]Все равно не получилось. :(
Очень не хотелось бы Вас грузить, но не могли бы Вы глянуть мой код (все лишнее я уберу)?
Плз, а то я уже 3-й день над этим долбаюсь, и не могу понять в чем заковырка. Вроде бы все "как по учебнику".
Я вышлю Вам на e-mail.
Digitman (2002-08-01 10:08:00) [4]А зачем усложнять в данном конкретном случае ?
У тебя само тело процедуры Click() - thread-safe.
Вот и оформи его в виде отдельного процедурного метода, не зависящего от визуальных контролов формы :
procedure TRDMServ.DoPostFile;
var
stm: TMemoryStream;
begin
stm := TMemoryStream.Create;
try
stm.LoadFromFile("c:\somefile.exe");
NMStrm1.PostIt(stm);
finally
stm.Free;
end;
end;
procedure TRDMServ.SendData;
begin
DoPostFile;
end;
Form1.Button1.Click;
procedure TForm1.Button1Click(Sender: TObject);
begin
DoPostFile;
end;
kostik78ua (2002-08-01 09:36:00) [5]Действительно, работает в разных Thread-ах.
Извиняюсь за дилетантский вопрос: А как делается эта синхронизация?
Digitman (2002-07-31 17:28:00) [6]Потому что - скорее всего - в момент выполнения TRDMServ.SendData не выполняется условие GetCurrentThreadId = MainThreadId.
Иными словами - нет синхронизации non-threadsafe-метода Click() с основным потоком