проблема с TClientSocket в своём класе
От: Morpeh  
Дата: 04.04.07 04:27
Оценка:
пишу свой клас:


class TGetFile
{
private:
  TClientSocket*  FileSocket;
  void __fastcall OnClientSocketRead(TObject *Sender, TCustomWinSocket *Socket);
public:
  TGetFile(AnsiString ServerIP, int ServerPort);
  ~TGetFile();
};

//---------------------------------------------------------------------------
TGetFile::TGetFile(AnsiString ServerIP, int ServerPort)
{
  FileSocket = new TClientSocket(NULL);
  FileSocket->Active = false;
  FileSocket->Host = ServerIP;
  FileSocket->Port = ServerPort;
  FileSocket->ClientType = ctNonBlocking;
  FileSocket->OnRead = OnClientSocketRead;
  FileSocket->Open();
}
//---------------------------------------------------------------------------
TGetFile::~TGetFile()
{
  if(FileSocket->Active)
    while(FileSocket->Active)
    {
      Application->ProcessMessages();
      FileSocket->Close();
    }
  delete FileSocket;
}
//---------------------------------------------------------------------------

в проге следующие строчки

TGetFile *GetFile = new TGetFile("127.0.0.1", 7777);
//работа с классом
delete GetFile;


до сервера вообще ни каких действий...
молчит и всё.
Если же код создания сокета в самой проге написать то всё ок.
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  FileSocket = new TClientSocket(NULL);
  FileSocket->Active = false;
  FileSocket->Host = "127.0.0.1";
  FileSocket->Port = 7777;
  FileSocket->ClientType = ctNonBlocking;
  FileSocket->Open();
}

В чём трабла?
Re: проблема с TClientSocket в своём класе
От: alex_mah Россия www.elsy.ru
Дата: 04.04.07 07:36
Оценка: 2 (1)
Здравствуйте, Morpeh, Вы писали:

Попробуй добавить обработчик для события OnConnect.
Там выставляй какой-нить флаг его срабатывания, а в конструкторе добавь Application->ProcessMessages() до срабатывания этого флага.
У меня была такая же проблема и решил я ее именно так.
Re[2]: проблема с TClientSocket в своём класе
От: Morpeh  
Дата: 04.04.07 08:07
Оценка:
Здравствуйте, alex_mah, Вы писали:

Спасибо, помогло, кто бы мог подумать...
я пробывал слип(1000) добавлять не помогало...
Re[3]: проблема с TClientSocket в своём класе
От: alex_mah Россия www.elsy.ru
Дата: 04.04.07 08:58
Оценка:
Здравствуйте, Morpeh, Вы писали:

M>Здравствуйте, alex_mah, Вы писали:


M>Спасибо, помогло, кто бы мог подумать...


Все логично. Сокет асинхронный работает в отдельном от твоего приложения потоке. Поэтому нужно обрабатывать сообщения, что бы приложение узнало об отработке коннекта.
У такого способа есть посторонний эффект. Твое приложение получает возможность параллельно с созданием класса выполнять другие обработчки, нажимать кнопки, вызывать срабатывания таймеров и пр. Если это критично, то нужно подумать над синхронизацией.
Re[4]: проблема с TClientSocket в своём класе
От: Danchik Украина  
Дата: 04.04.07 12:32
Оценка:
Здравствуйте, alex_mah, Вы писали:

_>Здравствуйте, Morpeh, Вы писали:


M>>Здравствуйте, alex_mah, Вы писали:


M>>Спасибо, помогло, кто бы мог подумать...


_>Все логично. Сокет асинхронный работает в отдельном от твоего приложения потоке. Поэтому нужно обрабатывать сообщения, что бы приложение узнало об отработке коннекта.

_>У такого способа есть посторонний эффект. Твое приложение получает возможность параллельно с созданием класса выполнять другие обработчки, нажимать кнопки, вызывать срабатывания таймеров и пр. Если это критично, то нужно подумать над синхронизацией.

По моему Application.ProcessMessages это за круто.
Достаточно будет процесать только сокетовые сообщения. Какие есть можна узнать: CM_SOCKETMESSAGE, CM_LOOKUPCOMPLETE, CM_DEFERFREE.

Ну а чтобы не кликалось куда не надо, можна седалать DisableTaskWindows и в конце EnableTaskWindows
Re[5]: проблема с TClientSocket в своём класе
От: alex_mah Россия www.elsy.ru
Дата: 04.04.07 13:05
Оценка:
Здравствуйте, Danchik, Вы писали:


D>По моему Application.ProcessMessages это за круто.

D>Достаточно будет процесать только сокетовые сообщения. Какие есть можна узнать: CM_SOCKETMESSAGE, CM_LOOKUPCOMPLETE, CM_DEFERFREE.

D>Ну а чтобы не кликалось куда не надо, можна седалать DisableTaskWindows и в конце EnableTaskWindows


Все правильно, мне просто некогда было это все отлаживать. Утилитка была для внутреннего пользования.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.