Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2009, 13:04   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Синхронизация в indy

Всем привет!
Искал в инете но не нашёл.
Короче дело обстоит так. Сервер должен при некоторых командах клиента перерисовать интерфейс. Проблема в том, что обработчик работает в потоке. Как мне сделать синхронизацию?
Altera вне форума Ответить с цитированием
Старый 05.10.2009, 08:40   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Подключи модуль idsync и вызови метод класса TidSync.Synchronize или определи свой синхронизующий метод и вызови TIdSync.SynchronizeMethod(твой метод);
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 06.10.2009, 07:59   #3
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
Подключи модуль idsync и вызови метод класса TidSync.Synchronize или определи свой синхронизующий метод и вызови TIdSync.SynchronizeMethod(твой метод);
Сделал так
Код:
procedure Tmain_wnd.c_showMessage(AContext: TIdContext; const param: string);
begin
   TidSync.Synchronize; //E2076 This form of method call only allowed for class methods 
   showMessage(param)
end;
Код:
procedure Tmain_wnd.c_showMessage(AContext: TIdContext; const param: string);
var
s: TidSync;
begin
   s.Synchronize; 
   showMessage(param)
end;
И толку нету

Код:
procedure Tmain_wnd.c_showMessage(AContext: TIdContext; const param: string);
begin
   TidSync.SynchronizeMethod(showm); // showMessage('someText');
end;
Сработало!


А вот так не работает.
Код:
tIdSync.SynchronizeMethod(close);

Последний раз редактировалось Altera; 06.10.2009 в 08:07.
Altera вне форума Ответить с цитированием
Старый 06.10.2009, 12:42   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Цитата:
Сделал так
Код:

procedure Tmain_wnd.c_showMessage(AContext: TIdContext; const param: string);
begin
TidSync.Synchronize; //E2076 This form of method call only allowed for class methods
showMessage(param)
end;
Код:

procedure Tmain_wnd.c_showMessage(AContext: TIdContext; const param: string);
var
s: TidSync;
begin
s.Synchronize;
showMessage(param)
end;
И толку нету
правильно, метод TidSync.Synchronize может быть вызван только из метода класса, а у вас метод екземпляра судя по всему
Цитата:
А вот так не работает.
Код:

tIdSync.SynchronizeMethod(close);
а и не должно- особеность реализации close в vcl
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 06.10.2009, 12:55   #5
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
особеность реализации close в vcl
Это только с close? или ещё есть, и как мне быть?
Altera вне форума Ответить с цитированием
Старый 06.10.2009, 13:02   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Вы можете определить свой метод, внутри которого будет вызван close и все должно работать корректно
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 06.10.2009, 19:28   #7
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Нет, ошибка!
tIdSync.SynchronizeMethod(selfClose );
Код:
...
tIdSync.SynchronizeMethod(selfClose);
...

procedure Tmain_wnd.selfClose;
begin
   close;
end;
Функция должна вызываться при переделённой команде.
Грубо говоря вот так:
Код:
procedure Tmain_wnd.serverExecute(AContext: TIdContext);
var
cmd: string;
begin
   cmd := AContext.connection.ioHandler.readLn;
   if sameText(cmd, 'close') then 
      tIdSync.SynchronizeMethod(selfClose);   
end;
Altera вне форума Ответить с цитированием
Старый 06.10.2009, 19:53   #8
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Хм... вы при активном потоке хотите завершить приложение ? в любом случае AV вам обеспечено )
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 07.10.2009, 18:14   #9
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
Хм... вы при активном потоке хотите завершить приложение ? в любом случае AV вам обеспечено )
Ну а как тогда?
Altera вне форума Ответить с цитированием
Старый 07.10.2009, 19:10   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может на сообщениях сделать?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как обновить indy 9 на indy 10 Пилигрим Компоненты Delphi 16 30.04.2010 10:11
Синхронизация yarilo Софт 2 07.08.2009 15:50
Синхронизация колонок eImage Microsoft Office Excel 4 13.03.2009 20:42
Indy 9 против Indy 10 OrdJONY Свободное общение 2 08.11.2008 20:28
Синхронизация приложений format Помощь студентам 2 13.04.2008 17:29