我刚才照几个回复试了试
似乎还是没找到导致错误的根本问题我把文件界面略改了改我这里的操作
生成EXE文件后
点击“连接”没问题
但再点击“发送”时,出错请大家再帮帮忙。
似乎还是没找到导致错误的根本问题我把文件界面略改了改我这里的操作
生成EXE文件后
点击“连接”没问题
但再点击“发送”时,出错请大家再帮帮忙。
解决方案 »
- vb中使用api选中视频文件,并获取该文件的大小、格式(wmv avi mpeg等)、帧率、播放长度这些属性
- 关于用winsock传字符串时,丢包的问题
- 注释问题
- 如何给子过程传递参数
- 如何去掉vb应用程序的标题栏
- 问一个非常土的问题,等于散分
- 有关一个WINSOCK和多线程的问题??如果能解决,我将以500分致谢!!(态度诚恳).希望能做的稳定点!
- 请求vb中将access表导出为excel表的成熟代码
- 超级简单问题
- 为什么运行不了!!
- 哪位大人帮忙解决CREATETHREAD线程问题,编译环境下运行没问题,生成EXE文件出错,谢谢!!
- 用代码将combobox的datasource指向data
'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
----------------------------------'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
'.......
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
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
也谢谢 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、鞠躬,答谢!
最起码用本机代码编译后是不会执行成功的,因为你在被创建的线程中进行了Com调用
被创建的线程中不是不可以进行com调用,是不能够越界访问对象MainForm.DoRecvPackage '这句的问题另外
While...wend最好换成 do .. loop ,while wend 可能会引起出错你将位于窗体中的 DoRecvPackage 代码全部写到模块中,不要进行对象访问,如 text1=XXX之类的不要出现
将返回信息存储在结构或变量中,再由主线程进行同步或者你干脆编译为 P 代码得了
都给PctGL吧.他的方案是正确的,我也学习了,呵呵;