2015-06-16 2 views
1

Вслед за this thread, я пытаюсь сделать приложение C++ Builder xe5 с:Indy TCP клиента в поток

  • основной формой
  • TIdTCPClient
  • TThread для этого TIdTCPClient ' s, которое открывает сокет, отправляет запрос, затем прослушивает несколько ответов неопределенно
  • Действия, которые происходят в сокете, будут вызывать обновления в основной форме

Я не смог найти примеров; примеры, связанные с страницей Indy Demos, не используют нити в своих клиентах, насколько я могу судить.

Мои вопросы:

  • Если TIdTCPClient быть на главной форме (в качестве компонента времени разработки), или же она должна быть переменная член класса потока?
  • В событиях, инициированных TIdTCPClient, необходимо ли синхронизировать код в обработчиках событий (которые являются функциями-членами моей основной формы)?
  • Безопасно ли как для основного потока VCL, так и для клиентского потока выполнять вызовы функций для объекта TIdTCPClient?

В настоящее время я принимаю действия по основной форме в ответ на каждое событие, а также в ответ на получение данных о сокете. В настоящий момент мой код полон временных переменных и функций заглушки, потому что Synchronize требует закрытия void(void), и это довольно спагетти. Поэтому я задаюсь вопросом, не принимаю ли я принципиально неправильный подход.

ответ

1

Должен ли TIdTCPClient находиться в основной форме (как компонент времени разработки) или должен быть переменной-членом класса нитей?

Любой будет работать нормально. Важно то, что вы вызываете Connect() и другие методы ввода-вывода в контексте рабочего потока (внутри его метода Execute()).

В событиях, инициированных TIdTCPClient, необходимо ли синхронизировать код в обработчиках событий (которые являются функциями-членами моей основной формы)?

Да, если они обращаются к элементам управления пользовательского интерфейса или к другим общим данным, которые необходимо защитить.

Безопасно ли для основного потока VCL и клиентского потока выполнять вызовы функций для объекта TIdTCPClient?

Это зависит от конкретных вызовов (например, отправки исходящих данных от основного потока во время чтения входящих данных в рабочем потоке, по крайней мере, в то время как клиент подключен), но я бы не советовал вам полагаться на что , Вы должны просто сохранить все ваши действия, связанные с клиентом, только в рабочем потоке.

В настоящий момент мой код полон временных переменных и функций заглушки, потому что для синхронизации требуется закрытие пустоты (void), и это довольно спагетти.

Вы можете использовать TIdSync/TIdNotify классы Indy, чтобы помочь вам сохранить, что спагетти код лучше организованы. Например, выведите класс из TIdSync, переместите в него свои переменные и переопределите его виртуальный метод DoSynchronize() для вызова вашего метода (ов) формы по мере необходимости. Затем вы можете создать экземпляр класса thee, заполнить его переменные, если необходимо, вызвать его метод Synchronize(), прочитать его переменные, если необходимо, а затем освободить его.

#include <IdSync.hpp> 

class TMySync : public TIdSync 
{ 
protected: 
    virtual void __fastcall DoSynchronize(); 
public: 
    // variables... 
}; 

void __fastcall TMySync::DoSynchronize() 
{ 
    // call Form methods, use variables as needed... 
} 

void __fastcall TMyThread::Execute() 
{ 
    //... 
    TMySync *sync = new TMySync; 
    // set variables as needed... 
    sync->Synchronize(); 
    // read variables as needed... 
    delete sync; 
    //... 
} 
+0

У TIdSync не было компонента, но я нашел его в . Похоже, он работает только с TIdThread (в настоящее время я использую TThread), поэтому, я думаю, я должен попытаться выяснить, как они работают на основе их документации API. –

+0

Нет, 'TIdSync' не является компонентом, а просто классом. И нет, вам не нужен 'TIdThread', чтобы использовать его. В XE5 это просто оболочка для статического метода 'TThread :: Synchronize()'. В 'IdSync.hpp' вообще не должно быть ссылок на' TIdThread'. Для версий C++ Builder до CB2005 это делает, но вы все равно можете использовать 'TIdSync', не используя' TIdThread' (он просто создает внутри себя для собственного использования). –

+0

Спасибо за это –

 Смежные вопросы

  • Нет связанных вопросов^_^