多线程 怎么在子线程中触发主线程创建窗体
我做一个聊天程序 就是一个人可以跟多个人聊 每个聊天窗口就是一个线程 
我用的indy IdTCPServer1 作接收端
每有人向程序发送聊天信息时 IdTCPServer1 新建一个线程进行聊天
但是新建的线程是子线程 而子线程中是不可以创建窗体的请问各位大哥该怎么解决啊
或者类似问题该用什么方法处理?

解决方案 »

  1.   

    void GetActiveWindowMehtod ( ) 

    //在拥有主窗体的线程上创建子窗体 
    this. Invoke ( new GetActiveWindowHandle ( GetActiveWindow )); 

    delegate void GetActiveWindowHandle ( ); 
    void GetActiveWindow ( ) 

    //在这里写创建新窗体的代码 
    frmChat fc = new frmChat ( ); 
    fc. Show ( ); 

    然后在子线程的方法了调用 GetActiveWindowMehtod(); 这是一个c#的子线程创建窗体的例子,有谁能帮我把它翻译成Delphi的吗?
      

  2.   

    你每个都要使用一个窗口,推荐自己写SOCKET 服务端,用WSAAsyncSelect SOCKET I/O模型效率应该不错
    你要用INDY的,可以都在主窗口的IdTCPServer1 的ONEXECUTE里读数据, 然后根据不同用户把数据传到窗口去显示,如果用户不存在的就新建窗口 
      

  3.   

    Synchronize(show);线程,当线程执行完毕后界面是不能动的,
    也就是说,必须在子线程中调用主线程创建窗体
    大哥们你们发言的时候能不能多说几句呢?
      

  4.   

    Synchronize(show),是可行的,谢谢大家光顾:我的问题解决了,是我刚开始弄错了
    procedure TForm2.IdTCPServer1TIdCommandHandler0Command(ASender: TIdCommand);
    这样用就没问题了
    ASender.Thread.Synchronize(SendMsg);