游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2695|回复: 7

菜鸟请教关于可能多线程编译选项错误引起的程序非法

[复制链接]

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
发表于 2005-6-20 16:43:00 | 显示全部楼层 |阅读模式
我打算尝试在wxWidgets中使用ACE的线程和SOCKET。
程序在linux下面编译连接运行均没有问题,子线程开启运行也都正确。

但是在Windows编译连接也没有问题,但是在开启线程时候(调用ACE_Task<ACE_MT_SYNCH>activate()时候),立刻非法。
虽然ACE和wxWidgets都提供了源代码,但是小弟水平太有限,完全看不懂。

ACE-5.4.0采用动态连接库方式
wxWidgets用的是2.6.1,编译时候选择UNICODE方式,多线程方式打开(Debug和Release都是)
g++版本是3.4.4

linux和windows下的编译方式都是一样的。如果是控制台方式的话,ACE的多线程在Linux和Windows下都是没有问题的。

有空的朋友请帮我看看,是编译参数有问题呢?还是ACE调用错误呢?或者是wxWidgets当初的编译选项有错误?还是ACE编译的时候不对呢?

附件中是eclipse的建立的工程代码,很短很短。请有经验的朋友一定帮忙看看。多谢多谢。

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2005-6-20 16:45:00 | 显示全部楼层

Re: 菜鸟请教关于可能多线程编译选项错误引起的程序非法

晕倒,附件怎么没有了。
传不上来了,才5K都不行吗?
麻烦加我的QQ。谢谢
285811859

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2005-6-20 17:05:00 | 显示全部楼层

Re:菜鸟请教关于可能多线程编译选项错误引起的程序非法

...ace还比较熟,wxWidgets就不熟了。。-。-

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2005-6-20 17:09:00 | 显示全部楼层

Re: Re:菜鸟请教关于可能多线程编译选项错误引起的程序

tarkey: Re:菜鸟请教关于可能多线程编译选项错误引起的程序非法

...ace还比较熟,wxWidgets就不熟了。。-。-


头文件
#ifndef _MYTASK_H_
#define _MYTASK_H_

#include "ace/Service_Config.h"
#include "ace/streams.h"
#include "ace/Synch.h"
#include "ace/Task.h"
#include "ace/Thread_Manager.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/OS_NS_sys_select.h"
#include "ace/Handle_Set.h"

class MyTask : public ACE_Task<ACE_MT_SYNCH>
{
private:
        int m_nPort;
        char m_SrvName[64];
public:
        MyTask();
        virtual ~MyTask();
        int svc ();
        bool Start();
        void Stop();
        bool Initialise(unsigned int port, const char* pIPAddress);
};


#endif //_MYTASK_H_


CPP文件
#include "MyTask.h"

MyTask::MyTask()
{
        m_nPort = 0;
        m_SrvName[0] = 0;
}

MyTask::~MyTask()
{
}

bool MyTask::Start()
{
        this->activate();//就是这里。linux没有问题,windows马上就挂了
        return true;
}

void MyTask::Stop()
{
        ACE_Thread_Manager::instance()->cancel_task(this);
        wait();
}

bool MyTask::Initialise(unsigned int port, const char* pIPAddress)
{
        m_nPort = port;
        strncpy(m_SrvName, pIPAddress, 64);
        return true;
}

int MyTask::svc ()
{
        // Connect Server
        // if Connect OK
        //    ....
        // else
        //    ....return
       
        // for(;;)
        ACE_NOTREACHED (return 0);
}

调用方式
        m_pMyTask = new MyTask;
        if(m_pMyTask == NULL
                || m_pMyTask->Initialise(3724, "127.0.0.1") == false
                || m_pMyTask->Start() == false)
        {
                delete m_pMyTask;
                m_pMyTask=NULL;
        }

这样有问题吗?

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2005-6-20 17:32:00 | 显示全部楼层

Re:菜鸟请教关于可能多线程编译选项错误引起的程序非法

。。。为什么继承的时候不是ACE_SYNCH_USE呢?

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2005-6-20 17:37:00 | 显示全部楼层

Re: Re:菜鸟请教关于可能多线程编译选项错误引起的程序

tarkey: Re:菜鸟请教关于可能多线程编译选项错误引起的程序非法

。。。为什么继承的时候不是ACE_SYNCH_USE呢?


我用习惯了。现在去try一下ACE_SYNCH_USE看看。第一感觉这个不是问题的根。:(

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2005-6-21 05:44:00 | 显示全部楼层

Re: 菜鸟请教关于可能多线程编译选项错误引起的程序非法

重新用非多线程方式重新编译wxWidgets。
然后编译选项选择-mthreads,程序编译连接无问题。但是只要运行立刻非法。

如果选择多线程方式编译wxWidgets的话,编译选项仍然选择-mthreads,如果使用ACE的来创建线程,windows操作系统下该程序创建线程马上就挂。

那么是否可以这样理解,wxWidgets创建线程和ACE创建线程是冲突的呢?(Linux下面不冲突)

预祝微软早日统一操作平台,就无客户要求之混乱,世界清静了,我也就不用无头苍蝇的乱撞了。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2005-6-21 10:31:00 | 显示全部楼层

Re:菜鸟请教关于可能多线程编译选项错误引起的程序非法

。。。界面这个东西,WINDOWS下还是MFC的好。。。-。-
如果可能的话你可以统一一套界面的接口,然后linux下用wxWidgets,WIN下用MFC。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-26 02:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表