请教高手:
在createpipe创建管道后,用Readfile读,当读不到数据时,阻塞在那里.请问如何实现读不到数据时立即返回,即如何实现非阻塞方式读管道?(加到500分)

解决方案 »

  1.   

    你可以使用CreateNamedPipe方法创建命名管道,在创建的时候在dwOpenMode 参数中指定FILE_FLAG_OVERLAPPED。这样会使得ReadFile在完成读操作以后立即返回。
      

  2.   

    Dim dwOpenMode As Long, dwPipeMode As Long    dwOpenMode = FILE_FLAG_OVERLAPPED 
        dwPipeMode = PIPE_WAIT Or PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGE    hNamePipe = CreateNamedPipe(PIPE_NAME, dwOpenMode, dwPipeMode, PIPE_UNLIMITED_INSTANCES, BUFFER_SIZE, BUFFER_SIZE, PIPE_TIMEOUT, 0&)我是这样用的。
      

  3.   

    Dim hReturn As Long
        Dim dwOpenMode As Long, dwPipeMode As Long    dwOpenMode = FILE_FLAG_OVERLAPPED Or PIPE_ACCESS_DUPLEX
        dwPipeMode = PIPE_NOWAIT Or PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGE
        hNamePipe = CreateNamedPipe(PIPE_NAME, dwOpenMode, dwPipeMode, PIPE_UNLIMITED_INSTANCES, BUFFER_SIZE, BUFFER_SIZE, PIPE_TIMEOUT, 0&)这样应该就对了,另外奉送该函数的说明,跟老大抢分不容易啊。HANDLE CreateNamedPipe(
      LPCTSTR lpName,                             // pipe name
      DWORD dwOpenMode,                           // pipe open mode
      DWORD dwPipeMode,                           // pipe-specific modes
      DWORD nMaxInstances,                        // maximum number of instances
      DWORD nOutBufferSize,                       // output buffer size
      DWORD nInBufferSize,                        // input buffer size
      DWORD nDefaultTimeOut,                      // time-out interval
      LPSECURITY_ATTRIBUTES lpSecurityAttributes  // SD
    );
    创建命名管道和打开已经存在的命名管道,其中lpName为管道名称,dwOpenMode为创建方式,可以是下面值的组合: 
    PIPE_ACCESS_INBOUND:管道只能用作接收数据。 
    PIPE_ACCESS_OUTBOUND:管道只能用作发送数据。 
    PIPE_ACCESS_DUPLEX:管道既可以发送也可以接收数据。(上面这三个值只能够取其中一个) 
    FILE_FLAG_WRITE_THROUGH:管道用于同步发送和接收数据,只有在数据被发送到目标地址时发送函数才会返回,如果不设置这个参数那么在系统内部对于命名管道的处理上可能会因为减少网络附和而在数据积累到一定量时才发送,并且对于发送函数的调用会马上返回。 
    FILE_FLAG_OVERLAPPED:管道可以用于异步输入和输出,异步读写的有关方法和文件异步读写是相同的。 
    dwPipeMode指定管道类型,可以是下面值的组合: 
    PIPE_TYPE_BYTE:数据在通过管道发送时作为字节流发送,不能与PIPE_READMODE_MESSAGE共用。 
    PIPE_TYPE_MESSAGE:数据在通过管道发送时作为消息发送,不能与PIPE_READMODE_BYTE共用。 
    PIPE_READMODE_BYTE:在接收数据时接收字节流。 
    PIPE_READMODE_MESSAGE:在接收数据时接收消息。 
    PIPE_WAIT:使用等待模式,在读,写和建立连接时都需要管道的另一方完成相应动作后才会返回。 
    PIPE_NOWAIT:使用非等待模式,在读,写和建立连接时不需要管道的另一方完成相应动作后就会立即返回。 
    nMaxInstances为管道的的最大数量,在第一次建立服务器方管道时这个参数表明该管道可以同时存在的数量。PIPE_UNLIMITED_INSTANCES表明不对数量进行限制。nOutBufferSize和nInBufferSize表示缓冲区的大小。nDefaultTimeOut表示在等待连接时最长的等待时间(以毫秒为单位),如果在创建时设置为NMPWAIT_USE_DEFAULT_WAIT表明无限制的等待,而以后服务器方的其他管道实例也需要设置相同的值。lpSecurityAttributes为安全属性,一般设置为NULL。如果创建或打开失败则返回INVALID_HANDLE_VALUE。可以通过GetLastError得到错误。 
      

  4.   

    相关的常量的值和数据结构的定义如FILE_FLAG_OVERLAPPED ,LPSECURITY_ATTRIBUTES 等等哪里可以找到? 或者哪里可以找到例子?
    多谢!
      

  5.   

    lz研究的好高深从 APIViewer2003 里面复制出来的Private Const FILE_FLAG_OVERLAPPED As Long = &H40000000
    Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
    End Type
      

  6.   

    请问 readfile 的第五个参数 OVERLAPPED 结构应如何初始化呢 ?
      

  7.   

    这样声明,然后直接传0进去就可以了。
    Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lplong As Long) As Long
      

  8.   

    用overlapped非阻塞方式,参数5不能传0,我已经付了正确的值。而且 createfile也用了相应的file overlapped属性。 但是仍然阻塞
      

  9.   

    把你代码发送到 taoxu.wei#chenoe.com
    我帮你看看
      

  10.   

    请问 readfile 的第五个参数 OVERLAPPED 结构应如何初始化呢 ?传  byval 0&就可以了
      

  11.   

    TechnoFantasy((VB MVP)www.applevb.com) ( )
    老大好,您的油香是[email protected]吗?
    能加我QQ吗?  我的QQ:4054450
      

  12.   

    http://community.csdn.net/Expert/TopicView1.asp?id=5666134
    已经通过上边的帖子结清100,还剩400。高手们都到哪里去了啊?
      

  13.   

    http://www.google.com/codesearch