PDA

View Full Version : سوال: سوال در مورد thread ها



yasser_beiraghi
یک شنبه 12 خرداد 1392, 11:36 صبح
با سلام .
(بستن main thread از يه thread ايجاد شده)
من قبلا از داخل برنامه يه پروسيجر رو به وسيله thread اجرا مي کردم. تو پراسيجر قفل برنامه رو چک مي کرد اگر هر مشکلي داشت خط application.Exit و بعد يه messagebox مي دادم که قفل وصل نيست. (برنامه بسته مي شد و يه پيغام رو صفحه مي موند). ولي الان بدون اينکه تغييري تو کد داده باشم به محض application.exit اجرا مي شه کل برنامه بسته مي شه و به messagebox نمي رسه. اگر هم بخوام بعد از messagebox بذارم تا موقعي که کاربر ok نکنه برنامه بسته نمي شه. اينم بگم چون پروسه چک کردن قفل طولاني هستش حتما بايد thread داشته باشم.
لطفا يه راهنماي بدين چجوري ميشه به همون حالت اول برگشت يا چه تغييري بايد بدم.
تشکر

tooraj_azizi_1035
یک شنبه 12 خرداد 1392, 15:46 عصر
اگه MessageBox بعد از Application.Exit باشه که نمایش داده نمیشه.
کدت رو بذار.

yasser_beiraghi
یک شنبه 12 خرداد 1392, 17:17 عصر
داخل procedure اصلي اين کد

Dim Th As New System.Threading.Thread(AddressOf Check)
Th.SetApartmentState(Threading.ApartmentState.STA)
Th.IsBackground = True
Th.Start()


توي procedure دوم اين کد

Public Sub Check()
' check lock code
If lockNotFound then
application.Exit
messageBox.Show("قفل يافت نشد")
End
End If
End Sub


قبلا اين کد کار مي کرد و مشکلي نداشت. main thread بسته مي شد و بعد messagebox داده مي شد و بعد از کليک کاربر برنامه کلا بسته مي شد.
از صبح درگيرشم. لطفا يه راهنمايي بکنين...

tooraj_azizi_1035
یک شنبه 12 خرداد 1392, 19:06 عصر
SetApartmentState رو کامنت کن و messageBox رو بیار قبل از App.Exit.

yasser_beiraghi
یک شنبه 12 خرداد 1392, 19:11 عصر
SetApartmentState رو آزمايش کردم. messagebox هم قبل از app.exit باشه تا کاربر کليک نکنه برنامه باز مي مونه. چون message از يه thread ديگست ميشه باکس رو گذاشتش کنار و از برنامه استفاده کرد. توضيح داده بودم...

yasser_beiraghi
دوشنبه 13 خرداد 1392, 08:52 صبح
چطوري ميشه از خود ويندوز يه messagebox باز کرد؟ يعني از vb نباشه. شايد بشه اين مشکل حل کرد.آخه به نظر کل مساله خيلي ساده مياد ولي نمي دونم چرا اينجور گره خورده...

tstsst
سه شنبه 14 خرداد 1392, 13:44 عصر
سلام
اگه درست متوجه شده باشم .

Dim Th As New System.Threading.Thread(AddressOf Check)
Th.SetApartmentState(Threading.ApartmentState.STA)
Th.IsBackground = True
Th.Start()


و قسمت تغییر کرده :

Public Sub Check()
If True Then
Application.Exit()
End If
End Sub

Private Sub hd()
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf hd))
Else
Me.Hide()
End If
End Sub

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
hd()
MsgBox("TEST")
End Sub

yasser_beiraghi
پنج شنبه 16 خرداد 1392, 17:42 عصر
ميشه کدتون رو کمي توضيح بدين چيکاري انجام ميده ؟

tstsst
جمعه 17 خرداد 1392, 10:52 صبح
Public Sub Check()
If True Then
Application.Exit()
End If
End Sub
اینجا که کد خودتونه و من فقط End رو برداشتم چون اون کل برنامرو فورسکلوز میکمه. و من فقط برنامرو بستم.


Private Sub hd()
If Me.InvokeRequired Then
Me.Invoke(New MethodInvoker(AddressOf hd))
Else
Me.Hide()
End If
End Sub
در اینجا در خواست کنند رو چک کردم چون باید با نخ اصلی یا (Main Thread) کد Me.hide یا Me.Enabled = False به اون احتیاج داره.
If Me.InvokeRequired Then

اینجا چک میکنیم نخ اصلی اگه مشغوله و وقتی نیست چی کار کنه. (مقدار True مشغوله)
Me.Invoke(New MethodInvoker(AddressOf hd))

در اینجام ما با نخ اصلی درخواست و دباری انجام میدیم که اگه آرگومان داشتی این طوری هم میتونی بنویسیش.

Me.Invoke(New MethodInvoker(AddressOf hd), arg)

--------------------------------------------

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
hd()
MsgBox("TEST")
End Sub

در اینجام که گفتم موقع بسته شدن فرم (دقیقا قبل بسته شدن) فرامین انجام شن.