Я использую Borland C ++ Builder 6. У меня есть приложение с формой.Приложение / основная форма начинает работу.(TThread
) Поток создает новый экземпляр сокета сервера и прослушивает данные.Когда поступают данные, поток отображает информацию в главной форме с помощью метода синхронизации.
Проблема заключается в том, что, когда поток отправляет информацию, при нажатии на пункт меню в главной форме выполнение потока временно останавливается.Если я закомментирую Form1->Memo1->Lines->Add(mStr)
в методе синхронизации, то есть поток не отправляет информацию в основную форму, поток продолжает выполняться без проблем.Таким образом, данные принимаются и отвечают правильно.
Как только я восстановлю строку и запишу данные в основную форму, и в основной форме будет выбран пункт меню, поток временно остановится.Есть ли способ остановить это поведение, чтобы поток никогда не «блокировался», но все же мог сообщать в основную форму?
После прочтения ответа Мартина вот что я сделал:
inMain.h:
#define WM_ADDLOG (WM_USER+0x0500)
class TForm1: public TForm
{
...
private:
void __fastcall virtual HandleAddLog(TMessage &msg);
...
public:
HWND hWnd;
TStringList *FStringBuf;
__property TStringList *StringBuf={read=FStringBuf,write=FStringBuf};
TCriticalSection tcsMsg;
...
protected:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_ADDLOG,TMessage,HandleAddLog)
END_MESSAGE_MAP(TForm)
}
в Main.cpp:
In TForm1 constructor:
...
hWnd=FindWindow(NULL,"SoftIEN");
if(!hWnd)
{
exit(0);
}
FStringBuf = new TStringList;
tcsMsg = new TCriticalSection;
...
void __fastcall TForm1::HandleAddLog(TMessage &msg)
{
String strN,strDateTime,strLine;
if(Memo1->Lines->Count>10000)
Memo1->Lines->Clear();
while(FStringBuf->Count)
{
strDateTime = "";
DateTimeToString(strDateTime, "yy/mm/dd hh:nn:ss.zzz: ", Now());
strN=FStringBuf->Strings[0];
FStringBuf->Delete(0);
strLine=strDateTime + strN;
Memo1->Lines->Add(strLine);
}
TForm::Dispatch(&msg);
}
In Thread.cpp
...
m_strMsg="Some Message";
AddLog();
...
void __fastcall TIENServerThread::AddLog()
{
Form1->tcsMsg->Acquire();
Form1->StringBuf->Add(m_strMsg);
Form1->tcsMsg->Release();
SendMessage(Form1->hWnd,WM_ADDLOG,0, 0);
}
Я также попытался PostMessage
в своей функции AddLog
.
Все работает нормально,сообщения записываются в заметку, но приложение по-прежнему «зависает», когда я нажимаю на главное меню формы.Любые другие идеи / помощь / примеры?
Спасибо за всю помощь!