我刚才照几个回复试了试
似乎还是没找到导致错误的根本问题我把文件界面略改了改我这里的操作
生成EXE文件后
点击“连接”没问题
但再点击“发送”时,出错请大家再帮帮忙。

解决方案 »

  1.   

    简单看了看,你需要在发包前判断一下是否已经创建了新的线程;如果否,是要报错的'1)在模块里:Public blnThreadCreared As Boolean
    '2)ConnectButton_Click最后加创建标志
    Private Sub ConnectButton_Click()
      '............
      '............
        blnCreared = True'加上此句
    End Sub
    3)SendPackageButton_Click开始判断是否创建了新线程
    Private Sub SendPackageButton_Click()
      If Not blnCreared Then
        MsgBox "尚未连接!"
        Exit Sub
      End If
      '............
      '............
    end sub
      

  2.   

    更正:
    ----------------------------------'1)在模块里声明:
    Public blnThreadCreared As Boolean'2)ConnectButton_Click最后加创建标志
    Private Sub ConnectButton_Click()
      '............
      '............
        blnThreadCreared = True'加上此句
    End Sub
    3)SendPackageButton_Click开始判断是否创建了新线程
    Private Sub SendPackageButton_Click()
      If Not blnThreadCreared Then
        MsgBox "尚未连接!"
        Exit Sub
      End If
      '............
      '............
    end sub
      

  3.   

    错误显示:“0x7350c26f”指令引用的“0x0000009c”内存,该内存不能为“written”
      

  4.   

    估计是线程创建失败,而你程序中未做判断.Private Sub ConnectButton_Click()
     '.......
        If r = 0 Then
            MsgBox "Connect successful!"
            g_recv_continue = True'结论过早了;
            g_hnd = CreateThread(ByVal 0&, ByVal 0&('这里 0 dwStackSize似乎不妥), AddressOf MainModule.SubRecvLoop, ByVal 0&, ByVal 0&, g_thdid)   '
         
            g_connected = True'不严谨!线程创建失败怎么办?
            
            ConnectButton.Enabled = False
            DisconnectButton.Enabled = True
            SendPackageButton.Enabled = True
        Else
            MsgBox "Connect Fail!"
        End If
    End Sub'-------------------------
    '看来主要问题还是集中在这个SUB,建议:
    Private Sub ConnectButton_Click()
      Dim r As Integer
      Screen.MousePointer = 11
      r = Connect("xxx.xxx.xxx.xxx", YOURPORT!!, "RMFK", "RMFK")
      If r = 0 Then
        'MsgBox "Connect successful!"
        g_connected = True
        ConnectButton.BackColor = vbYellow '用按钮颜色表示程序状态
        ConnectButton.ToolTipText = "Connect successful"
        ConnectButton.Enabled = False
        'g_hnd = CreateThread(ByVal 0&, ByVal 0&('这里 0 dwStackSize似乎不妥), AddressOf MainModule.SubRecvLoop, ByVal 0&, ByVal 0&, g_thdid)
        
        'dwStackSize改为2000试一下
        g_hnd = CreateThread(0, 2000, AddressOf MainModule.SubRecvLoop, 0, 0, g_thdid)
        Screen.MousePointer = 0
        If g_hnd <> 0 Then
          g_recv_continue = True
          DisconnectButton.Enabled = True
          SendPackageButton.Enabled = True
          ConnectButton.BackColor = vbGreen
          ConnectButton.ToolTipText = "ready for working"
        Else
          MsgBox "Fail to create new thread!"
          ConnectButton.ToolTipText = "Application would raise a fatal exception due to the fail of create multi-thread"
        End If
      Else
        MsgBox "Connect Fail!"
        ConnectButton.BackColor = vbRed
        ConnectButton.ToolTipText = "Connect Fail"
      End If
      Screen.MousePointer = 0
    End Sub
      

  5.   


      g_hnd = CreateThread(0, 2000, AddressOf MainModule.SubRecvLoop, 0, 0, g_thdid)
      '' 我没下你的源码看,不过从你的代码上来看建议你这样试试
       '' 在 createthread 后立即调用 closehandle
       closehandle g_thdid
       ' 正确的代码应该是 closehandle g_hnd
       ' 此处 关闭的是 线程 ID,是"作弊"的方法, 你可以试试,如果不行就改成 注释里面的代码
        '因为考虑到线程的句柄可能会继续使用所以并没有关闭,但必须调用一次 closehandle
       '试试吧,不行我再帮你想别的办法    Screen.MousePointer = 0
        If g_hnd <> 0 Then
          g_recv_continue = True
          DisconnectButton.Enabled = True
          SendPackageButton.Enabled = True
          ConnectButton.BackColor = vbGreen
          ConnectButton.ToolTipText = "ready for working"
        Else
          MsgBox "Fail to create new thread!"
          ConnectButton.ToolTipText = "Application would raise a fatal exception due to the fail of create multi-thread"
        End If
      

  6.   

    先谢谢 toury兄 和 PctGL兄 的援手相助
    也谢谢 myjian兄的友情帮T上来看到回复
    就依次试了试,结论依然不乐观
    下面我把调试的过程,略述一下1、先按toury兄的指点
    将ConnectButton_Click()的程序加以修改之后,
    在编译状态下,任何操作都没问题
    在生成EXE之后,“连接”没问题,
    但“发送”和“断开”都出现我上面提及到的“某段内存不能WRITTEN”的错误。2、之后,按PctGL兄的指点
    在toury兄程序的基础上略回修改
    即:在g_hnd = CreateThread(………)之后
        使用  closehandle g_thdid 强行断开线程
    在编译状态下,任何操作无问题
    在生成EXE之后,“连接”没问题
    但“发送”和“断开”也出现如上错误
    (另:我用closehandle g_thdid 和 closehandle g_hnd 分别试过,结果一样)3、根据程序运行的状况来看
       线程应该是建立了
       因为并未出现任何未建立连接或重大错误的提示4、所以,挺不好意思地说一句
       问题还没有解决
       还请两位多多帮忙。
       千万别不耐烦了,把这问题给丢一边哈5、鞠躬,答谢!
      

  7.   

    不用找也不用问了,你的代码不会在编译后的情况下执行成功的
    最起码用本机代码编译后是不会执行成功的,因为你在被创建的线程中进行了Com调用
    被创建的线程中不是不可以进行com调用,是不能够越界访问对象MainForm.DoRecvPackage '这句的问题另外 
    While...wend最好换成 do .. loop ,while wend 可能会引起出错你将位于窗体中的 DoRecvPackage  代码全部写到模块中,不要进行对象访问,如 text1=XXX之类的不要出现
    将返回信息存储在结构或变量中,再由主线程进行同步或者你干脆编译为 P 代码得了
      

  8.   

    两个帖子都不能给我分,因为没帮你解决问题,再说,分对我没什么用;
    都给PctGL吧.他的方案是正确的,我也学习了,呵呵;
      

  9.   

    还是这里的气氛好,相比之下 vbgood 到是很差劲了
      

  10.   

    PctGL..........有点眼熟呀.......好象上次丹心兄有理到过你....?我来说说我的意见:编译为本地代码后非法操作的问题,我也小有研究过.经过跟踪,发现每次出错时,都是在VB调用API之后,将返回的一个错误状态写回到当前对象...?貌似是,太久了,记不清楚了...根据豆前辈的分析,我就采用了"TLB库声明API"法来完成API的引入,这样的话,VB就不会自作主张地调用线程本地存储了...实际情况也如豆子所分析的一样,确实没有出问题了.LZ可以试一下.不过,也如豆子所说,"累"....当时我做这实验时,一共使用了十来个API,真的累.......祝你好运罗~~~~:)