PDA

View Full Version : انجام یک کار پس از کار دیگری



milad.biroonvand
سه شنبه 05 اسفند 1393, 21:56 عصر
من می خوام یک کار محاسباتی رو انجام بدم و اینکار محاسباتی چندین ثانیه طول میکشه و میخام برای اینکه کاربر کار دیگه ای انجام نده پیغام بدم که لطفا صبر کنید و وقتی کار کاملا تموم شد پیغام مخفی بشه؟
چطور اینکار رو بکنم

Hossis
سه شنبه 05 اسفند 1393, 22:18 عصر
از حلقه while استفاده کن
با این حلقه چک می کنی که آیا اون کار انجام شده یا نه
While Webbrowser.readystate<>completed
my.application.doevents
End while

golbafan
سه شنبه 05 اسفند 1393, 22:26 عصر
اگر برنامه شما بدون ترد نوشته شده باشه خود به خود سیستم تا زمان پایان اون تابع هنگ میکنه :بامزه:
و کاربر نمیتونه کار دیگه ای بکنه

حالا میتونید قبل از شروع تابع یک فرم شامل پیامتون نشون بدی و بعد از تابع ببندینش

milad.biroonvand
سه شنبه 05 اسفند 1393, 23:10 عصر
اگر برنامه شما بدون ترد نوشته شده باشه خود به خود سیستم تا زمان پایان اون تابع هنگ میکنه
:بامزه:
و کاربر نمیتونه کار دیگه ای بکنه

حالا میتونید قبل از شروع تابع یک فرم شامل پیامتون نشون بدی و بعد از تابع ببندینش


این رو میدونم، نحوه نوشتنش به چه صورته؟

milad.biroonvand
سه شنبه 05 اسفند 1393, 23:11 عصر
از حلقه while استفاده کن
با این حلقه چک می کنی که آیا اون کار انجام شده یا نه
While Webbrowser.readystate<>completed
my.application.doevents
End while

سلام
حاجی متوجه نشدم دقیقا کدی که نوشتی چه کاری انجام میده؟

Saman_12
سه شنبه 05 اسفند 1393, 23:39 عصر
سلام.
نمی دونم این کار اصولیه یا نه اما میتونید به نحو ه زیر انجامش بدید :

Private Class StopState


Public Property Action As [Delegate]
Public Property Arguments As Object()
Public Property Result As Object
Public Property ResetEvent As ManualResetEvent


Public Sub New(act As [Delegate], reset As ManualResetEvent, args() As Object, result As Object)


Me.Action = act
Me.ResetEvent = reset
Me.Arguments = args
Me.Result = result
End Sub
End Class


Private Sub MakeStop(frm As Form, act As [Delegate], ByRef args() As Object, ByRef result As Object)


Dim resetevent As New ManualResetEvent(False)
Dim state As New StopState(act, resetevent, args, result)


Dim shw_t As New Thread(AddressOf ShowForm)
Dim act_t As New Thread(AddressOf DoAction)


shw_t.IsBackground = True
shw_t.Start(frm)


act_t.IsBackground = True
act_t.Start(state)


resetevent.WaitOne()
shw_t.Abort()


result = state.Result
args = state.Arguments
End Sub


Private Sub DoAction(state As StopState)


state.Result = state.Action.DynamicInvoke(state.Arguments)
state.ResetEvent.Set()
End Sub


Private Sub ShowForm(frm As Form)


frm.ShowDialog()
End Sub


Public Delegate Function Some_Delegate(say As String) As String
Public Function Some(say As String) As String
'do some thing here id do nothing ...
Thread.Sleep(5000)
Return say
End Function


Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown


Dim args() As Object = New Object() {"HI"}
Dim result As Object = New Object
Dim act As New Some_Delegate(AddressOf Some)
Dim frm_msg As New Form


MakeStop(frm_msg, act, args, result)


Console.WriteLine(result)
End Sub

golbafan
سه شنبه 05 اسفند 1393, 23:52 عصر
سلام


1- showform
2- run yourfunction
3- closeform

Hossis
چهارشنبه 06 اسفند 1393, 00:44 صبح
سلام
حاجی متوجه نشدم دقیقا کدی که نوشتی چه کاری انجام میده؟
شما بیرون از تابع، یک متغیر بولین قرار بدید
بعدش تو تابع محاسباتی ، هروقت که کار تابع تموم شد، اون رو برابر True قرار بدید
حالا حلقه while چک می کنه که آیا متغیر فوق True شده یا نه، تا زمانی که False باشه، این حلقه دور خودش می گرده و به جلو نمیره، به محضی که True شد، حلقه فوق تمام شده و کار بعدی شروع میشه