![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему повисает MIDAS-сервер при попытке сделать такое:
Aleksandr © (2003-04-11 19:37:00)На RemoteDataModuleCreate пишу:
begin
MainForm.IncConnectCount
end;
procedure MainForm.IncConnectCount;
begin
FCCount:=FCCount+1;
MainForm.StatusBar.Panels[0].Text:=IntToStr(FCCount)
end;
И все. На этом форма умирает (при этом кнопочка "закрыть" в Caption остается доступна и закрывает программу при нажатии). То же происходит, если попытаться какой нибудь Label.Caption присвоить string из того же метода... Какие-то тут условности есть?
Набережных С. (2003-04-14 18:28:00) [1]>Aleksandr © (14.04.03 14:06)
Для AnsiString поддерживается механизм подсчета ссылок. Как только счетчик обнуляется, строка освобождается. Т.е. строка "умрет" при выходе из SendStatus и в момент получения сообщения на ее месте в памяти могут быть совсем другие данные.
На всякий случай попутно предупрежу, что в конструкторе RemoteDataModule для связи с главным потоком нельзя использовать синхронные механизмы из-за применения семафора в методе TComponentFactory.CreateInstance, можно только асинхронные.
Aleksandr (2003-04-14 14:06:00) [2]Спасибо. Только опять мне глупому, немного неясно - а почему через PChar все должно быть? Чем строка не плоха?
ErikIvanov (2003-04-14 12:39:00) [3]Например так.
procedure SendStatus(const Value: String);
Var Str: PChar;
begin
Str := StrNew(PChar(Value));
PostMessage(Application.Handle,msgChangeMessage,0,Integer(Str));
end;
procedure ReciveStatus(Var Value: String; Msg: TMessage);
var Str: PChar;
begin
Str := PChar(Msg.lParam);
Value := Str;
StrDispose(Str);
end;
Или записать в переменую и спокойно в UMRefreshStatus считать. Если хочется очень коректно то можно с TCriticalSection
Aleksandr (2003-04-14 12:24:00) [4]Спасибо! А что делать в случае со строковыми переменными?
Набережных С. (2003-04-13 09:34:00) [5]Если потоковая модель <> Single:
procedure MainForm.IncConnectCount;
begin
InterlockedIncrement(FCCount);
PostMessage(Handle, UM_RefreshStatus, 0, 0);
end;
procedure MainForm.UMRefreshStatus(var Message: TMessage);
begin
MainForm.StatusBar.Panels[0].Text:=IntToStr(FCCount)
end;