2003-10-05 22:14:50 服务启动
2003-10-05 22:15:10 开始一个IO处理(线程): 重叠 I/O 操作在进行中。
2003-10-05 22:15:10 连接数据库:1
2003-10-05 22:15:10 某项操作
2003-10-05 22:15:50 开始一个IO处理(线程): 当文件已存在时,无法创建该文件。
-------------------------------------------
这是一个多线程的程序,当服务一启动时,程序开一个线程操作正常,并提示:重叠 I/O 操作在进行中。
当第二个线程运行时,就无法操作,请问怎么回事!如何解决,谢谢!!!SleepEx 延缓当前线程,直到其他完成
dwIndex = SleepEx(INFINITE, TRUE);

解决方案 »

  1.   

    这个是服务端,监听的
    用到了一个 COM 接口,这个接口是不是就是所谓的文件操作呢?
    代码太多了,无法帖出来,太麻烦了!~~谢谢~~~
      

  2.   

    共享资源冲突?(句柄冲突)?是不是两个线程同时使用一个 OVERLAPPED ?
      

  3.   


    代码不是我写的,而且很多代码,看的都头疼
    系统报的错误:“当文件已存在时,无法创建该文件。”这个是什么意思呢?
    什么文件在使用呢?又是哪个文件在创建呢?我看代码里根本没有创建文件的意思
    OVERLAPPED 是什么意思???
    不行了~~~头大了~~~
      

  4.   

    代码不是我写的,而且很多代码,看的都头疼
    系统报的错误:“当文件已存在时,无法创建该文件。”这个是什么意思呢?
    什么文件在使用呢?又是哪个文件在创建呢?我看代码里根本没有创建文件的意思
    OVERLAPPED 是什么意思???
    不行了~~~头大了~~~
    //////////////////////////////////////////////////////////////////
    那就应该是你重复打开串口了,串口设备不能共享,对所有的进程以及线程有且仅能打开一次,你可能把打开串口的代码放到了线程中,这样打开多个这样的线程后只有第一个打开串口的线程运行正常,别的线程将不能真正运行(甚至有可能影响到第一个打开串口的线程).没看到你的代码,根本不可能知道你代码的问题,如果可能发到我又想看看吧,[email protected]
      

  5.   

    谢谢楼上,不过这个代码是有版权的啊,我不能随便发的啊,我真想发给你请教
    可是,唉,真是麻烦~~~
    我再仔细看看
    不过,那个代码不是操作 串口的,只用到一个关于操作 IIS 的 COM 接口
    再次感谢~~~
      

  6.   

    //************************************************************
    // 监听 :: 打开一个 SOCKET 接收 UDP 消息
    //************************************************************
    WSADATA wsa;
    sockaddr_in InternetAddr;
    auto_ptr<char> pbBuf(new char[SOCKET_BUFFER_SIZE]);
    ZeroMemory(pbBuf.get(), SOCKET_BUFFER_SIZE); //----------------------------------------
    // 初始化 SOCKET
    //----------------------------------------
    if ( 0 != WSAStartup(MAKEWORD(2,2), &wsa) ) {
    lstrcpy(CErrorOperation::s_tszDump, _T("SOCKET初始化失败"));
    CErrorOperation::s_dwErrorCode = WSAGetLastError();
    CErrorOperation::WriteErrorLog();
    return 0;
    } //----------------------------------------
    // 配置本地监听的 SOCKET IP 和端口
    //----------------------------------------
    InternetAddr.sin_family  = AF_INET;
    InternetAddr.sin_addr.S_un.S_addr  = inet_addr(g_ConfigInfo.szLocalIP);
    InternetAddr.sin_port  = htons(g_ConfigInfo.usLocalPort); g_sReceive = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if ( INVALID_SOCKET == g_sReceive ) {
    lstrcpy(CErrorOperation::s_tszDump, _T("SOCKET()失败"));
    CErrorOperation::s_dwErrorCode = WSAGetLastError();
    CErrorOperation::WriteErrorLog();
    return 0;
    } if ( SOCKET_ERROR == bind(g_sReceive, (PSOCKADDR)&InternetAddr, sizeof(InternetAddr)) ) {
    lstrcpy(CErrorOperation::s_tszDump, _T("SOCKET()绑定失败") );
    CErrorOperation::s_dwErrorCode = WSAGetLastError();
    CErrorOperation::WriteErrorLog();
    closesocket(g_sReceive);
    return 0;
    } //----------------------------------------
    // 设置如果缓冲区溢出,则首先抛弃最早收到的消息
    //----------------------------------------
    ULONG ulArg = 1;
    if ( SOCKET_ERROR == ioctlsocket(g_sReceive, SIO_ENABLE_CIRCULAR_QUEUEING, &ulArg) )
    {
    CErrorOperation::s_dwErrorCode = WSAGetLastError();
    CErrorOperation::WriteErrorLog();
    closesocket(g_sReceive);
    return 0;
    } //----------------------------------------
    // 设置重叠IO,接收数据
    //----------------------------------------
    WSAOVERLAPPED Overlapped;
    ZeroMemory(&Overlapped, sizeof(WSAOVERLAPPED)); g_DataBuf[0].len = SOCKET_BUFFER_SIZE;
    g_DataBuf[0].buf = pbBuf.get();
    ZeroMemory(g_DataBuf[0].buf, g_DataBuf[0].len); int dwFromLen = sizeof(sockaddr_in);
    DWORD dwRecvBytes = 0;
    DWORD dwFlags = 0;
    DWORD dwIndex = 0; //----------------------------------------
    // WorkerRoutine()
    //----------------------------------------
    if ( SOCKET_ERROR == WSARecvFrom(g_sReceive, g_DataBuf, 1, &dwRecvBytes, &dwFlags, 
    (PSOCKADDR)&g_sockAddrDest, &dwFromLen, &Overlapped, WorkerRoutine) ) {
    if ( WSAGetLastError() != WSA_IO_PENDING ) {
    lstrcpy(CErrorOperation::s_tszDump, _T("WSARecvFrom()失败"));
    CErrorOperation::s_dwErrorCode = WSAGetLastError();
    CErrorOperation::WriteErrorLog();
    closesocket(g_sReceive);
    return 0;
    }
    } //----------------------------------------
    // 开始监听
    //----------------------------------------
    while ( true ) {
    //INFINITE 定义了一直在监听这个端口
    dwIndex = SleepEx(INFINITE, TRUE);
    if ( WAIT_IO_COMPLETION == dwIndex ) {
    lstrcpy(CErrorOperation::s_tszDump, _T("开始一个IO处理"));
    CErrorOperation::s_dwErrorCode = WSAGetLastError();
    CErrorOperation::WriteErrorLog();
    }else {
    //IO处理失败
    lstrcpy(CErrorOperation::s_tszDump, _T("IO处理失败"));
    CErrorOperation::s_dwErrorCode = WSAGetLastError();
    CErrorOperation::WriteErrorLog();
    break;
    }
    }
    closesocket(g_sReceive);
    //清理SOCKET
    WSACleanup();
    ---------------------------------------------------------------
    代码就是这些,怎么回事啊~~~请高手帮忙~~~
    谢谢~~~