有三个线程,怎么让三个线程按顺序完成?

XING979020 2012-05-27 08:02:02
有三个线程,怎么让三个线程按顺序完成?
第一个线程是主线程,这里有代码会读取数据,然后在第一线程里有第二个线程及第三个线程,这两个线程会利用第一个线程得到的数据进行写及数据库,第三个线程需要等到第二个线程完成后,再运行。第一个线程里有一个循环,读取一条数据,就开始运行第二,第三线程。

Sub Check()
Try
TimerTest.Enabled = False
'System.Threading.Thread.Sleep(2000)
Application.DoEvents()
JiaoYuTemp = GetAlipayCz(AliapyHtml, TxtBeginStr.Text.Trim, TxtEndStr.Text.Trim)
Dim Str As String
Dim j As Integer = 0 '由1开始读取数据,因为0的数据是空的
If Not IsNothing(JiaoYuTemp) Then
Application.DoEvents()
For Each Str In JiaoYuTemp
Application.DoEvents()
If Str.Trim <> "" Or Str.Trim <> Nothing Then
‘此处是分析代码

Dim NotData As Boolean
NotData = CheckRecord("Cztj", "JiaoYuHao='" & JiaoYiHao & "'")'检查数据库是否已经存在该条数据
If Not NotData Then

'开另一个进程做循环并设置来保存充值记录到数据库的值
TreadTwo = New Thread(New ThreadStart(AddressOf UpdataSiteSql))
TreadThree = New Thread(New ThreadStart(AddressOf UpdataUserLocalHostSql))
TreadFour = New Thread(New ThreadStart(AddressOf UpdataUserSiteSql))
TreadTwo.Start()
TreadThree.Start()
TreadFour.Start()

TreadTwo.Join()
TreadThree.Join()
TreadFour.Join()
End If
End If


'System.Threading.Thread.Sleep(2000)
'j = j + 1
Next
Else
Application.DoEvents()
'AliapyHtml = GetUrlHtml()
JiaoYuTemp = GetAlipayCz(Html, TxtBeginStr.Text.Trim, TxtEndStr.Text.Trim)
Check()
End If
If TreadOne.IsAlive Then
TimerTest.Enabled = True

End If
Catch ex As Exception

End Try
End Sub

大家帮我看一下,应该怎么保证一个线程完成后,再执行另一个线程。
...全文
745 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
buctcub 2012-11-21
  • 打赏
  • 举报
回复
既然要等到第二个线程完成再进行第三个线程,那么第三个线程就是脱裤子放屁,直接放在第二个线程里面不就行了么? 如果一定要脱裤子放屁,那就要先保证裤子脱了,可以设置一个模块变量,在第二个线程结束的时候改变这个变量,然后在第三个线程开始的地方循环读取这个变量,直到这个变量被赋值了,就说明第二个线程结束了,然后就可以放屁了。。。。。 这个是最简单的办法。。
angel6709 2012-11-20
  • 打赏
  • 举报
回复
既然是顺序执行,就顺序执行。不要“多线程”。 同意,实在有这样的需求可以用AutoResetEvent
  • 打赏
  • 举报
回复
引用 3 楼 XING979020 的回复:
能具体说说吗? 我对这个多线程不太理解!
既然是顺序执行,就顺序执行。不要“多线程”。
suaiyu 2012-11-17
  • 打赏
  • 举报
回复
你的做法和顺序执行没什么差别,还不如使用异步执行
XING979020 2012-10-18
  • 打赏
  • 举报
回复
已经用单线程制定了,但占用CPU
lvlvlvlylyly 2012-10-18
  • 打赏
  • 举报
回复
我不知道你写数据库是怎么写的,但推荐使用sql命令,或是一次性更新地那种写入,不要一行一行插,这样一则很慢,二则很危险,万一程序中断,或关闭,或停电,无法一次完成.

我写数据库都是一次性地使用sql命令,或用dataset一次性更新,交给服务器去做,让服务器自己跟自己搞,就算本地关闭了EXE,也不影响.

如果这么弄的话,哪要多线程??
lbcsdb 2012-10-18
  • 打赏
  • 举报
回复
不太懂,希望可以清楚解释一下!
一根葱的无奈 2012-07-25
  • 打赏
  • 举报
回复
3个方法,3个函数,丢在一个线程里就好了吧!
silentcross 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

最后没有办法,已经放弃使用多线程了。
[/Quote]

这就对了,明明是单线程的事情,干嘛为了线程而线程
种草德鲁伊 2012-07-16
  • 打赏
  • 举报
回复
可以用WaitHandle控制线程等待完成信号。
lh1220 2012-07-16
  • 打赏
  • 举报
回复
用 JION方法
XING979020 2012-06-17
  • 打赏
  • 举报
回复
最后没有办法,已经放弃使用多线程了。

lh1220 2012-06-16
  • 打赏
  • 举报
回复
我也想知道多线程
cn5iads 2012-06-02
  • 打赏
  • 举报
回复
我也想知道,帮你顶一下。
XING979020 2012-05-28
  • 打赏
  • 举报
回复
有人懂吗??

如何保证循环里的等待一个线程执行后再进入下一个循环??
XING979020 2012-05-27
  • 打赏
  • 举报
回复
Private Sub TimerTest_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerTest.Tick
Try
Static i As Integer
i = i + 1
Select Case i
Case 1
OpenUrl(Txt_Url.Text.Trim)
Case Int(Txt_Time_Xuaxing.Text) * 1
OpenUrl(Txt_Url.Text.Trim)
'开另一个进程做循环并设置来保存充值记录到数据库的值
TreadOne = New Thread(New ThreadStart(AddressOf ThreadFun))
TreadOne.Start()

i = 0
Case i > Int(Txt_Time_Xuaxing.Text) * 3
i = 0
End Select
Catch ex As Exception

End Try
End Sub

Private Sub ThreadFun()
If Me.InvokeRequired Then
Dim newDelegate As New UIDelegate(AddressOf Check)
Me.Invoke(newDelegate)
End If
End Sub

我的这个Check也是线程来的。
XING979020 2012-05-27
  • 打赏
  • 举报
回复
能具体说说吗?
我对这个多线程不太理解!
threenewbee 2012-05-27
  • 打赏
  • 举报
回复
你用了thread.join 但是用法是错误的。
应该是thread之间join,而不是和main thread结合。
threenewbee 2012-05-27
  • 打赏
  • 举报
回复
thread.join

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧