PDA

View Full Version : ایجاد Waiting برای کاربر



roxe77
دوشنبه 16 خرداد 1390, 00:41 صبح
من برنامه ای نوشتم که وقتی یوزر اجرا میکنه چون قفل سخت افزاری و یه سری تبادل اطلاعات انجام میده پیچ wellcome نرم افزار حدود 15 ثانیه ای هنگ میکنه بعد برنامه run میشه . میخواستم یه کاری کنم که اون 15 ثانیه ای که صرف بررسی قفل و چک ، کپی یه سری فایل ها میشه یه صفحه waitng بیاد و اون اعمالی که پردازش میشه پشت زمینه اون waiting باشه ! لطفا کمکم کنید

Alirezanet
دوشنبه 16 خرداد 1390, 01:13 صبح
شما میتونید از Splash Screen استفاده کنید تا سر کاربر گرم شه ولی من راه بهتری رو پیشنهاد میکنم ...
اجازه بدین برنامتون اجرا شه بعد توی یک Thread مجزا بزارین قفلهاتون چک شه ... اگه با Thread هم آشنا نیسنید میتونین از BackgrounWorker استفاده کنید .....

البته شما میتونید توی همون Splash Screen که گذاشتین از Backgroun Worker استفاده کنید و مثلا یه Loading... با ProgsessBar به کاربرتون نشوم بدین !

roxe77
دوشنبه 16 خرداد 1390, 01:21 صبح
70778
یه نخ نوشتم وای تو نخ نمیتونه اینو اجرا کنه ولی اگه نخ نباشه اجرا میشه
علتش چیه

roxe77
دوشنبه 16 خرداد 1390, 01:23 صبح
میشه یه مثالی برامم پیدا کنین ! دهنم سرویس شد

roxe77
دوشنبه 16 خرداد 1390, 10:57 صبح
کسی کمکم نمیکنه!!

محمد باقری نسب
دوشنبه 16 خرداد 1390, 11:09 صبح
دوست عزیز این exception به خاطر این است که شما میخواهید به کلاسی خارج از thread جاری دسترسی پیدا کنید. جهت انجام این کار میبایست درخواست را Invoke و یا BeginInvoke کنید (سی شارپ):

MainPoultry.BeginInvoke(new Action(() => {
MainPoultry.WindowState = FormWindowState.Minimized;
...
}));

roxe77
دوشنبه 16 خرداد 1390, 11:32 صبح
ممنون میشه یه مثالی برام پیدا کنی که یه پروگرس بار حرکت کنه و پشت زمینه اون ایه ترد یه کاری انجام بده اگه موقع پر شدن پروگرس بار مثلا اون ترد جواب داد که قفل متصل نیست و پروگرس بار استاپ کنه و پیام دلخواه من رو بده و برنامه end بشه؟

محمد باقری نسب
دوشنبه 16 خرداد 1390, 14:11 عصر
progressbar شما قراره درصد انجام کار رو نشون بده و یا نه فقط برای اینکه کاربر رو مشغول نگهش داره قراره نمایش بدینش (Waiting)؟

roxe77
دوشنبه 16 خرداد 1390, 18:20 عصر
ببین من میخام اون چند ثانیه ای که هنگ میکنه ( در حال تست قفل و ... ) یه پروگرس بار بیاد همین

pouyansaraf
دوشنبه 16 خرداد 1390, 21:30 عصر
سلام
من همچین چیزی رو تو برنامه ام استفاده کرده ام
ولی قفل usb در حدود چند صد میلی ثانیه طول میده چند ثانیه اصلا خوب نیست

چرا از ProgressBar1.Style = ProgressBarStyle.Marquee استفاده نمیکنی که دیگر نیاز نباشد میزان پروگرسبارتو زیاد کنی
:خجالت:

nader.golab
دوشنبه 16 خرداد 1390, 21:53 عصر
70778
یه نخ نوشتم وای تو نخ نمیتونه اینو اجرا کنه ولی اگه نخ نباشه اجرا میشه
علتش چیه

سلام دوست عزیزم.
ببین تو ترید یا کنترل هایی امثال این نمی شه که از کنترل استفاده کرد.اما استفاده از Backgroun Worker خیلی بهتره چون اصولی تره کارش نسبت به ما.اما تو رویداد DoWork می تونی بعضی از کنترال هایی رو که فقط Get می کنی و Set نمی کنی استفاده کنی.حالا تجزیه و تحلیلش کن.
و از همه راحتر اینه که بهت می گم که برنامت لااقل قفل نمی کنه و شاید بتونی کار دیگه ای هم بکنی:


Application.DoEvents()


سوال من از شما:
قفل شما چیه؟
از کدوم شرکت؟
چند ساله باهاش کار می کنین؟

چند پیشنهاد به مدیران سایت:
پستی به نام جملات زیبا در برنامه بگزارید برای اینکه جملات قشنگ و قابل فهم در برنامه به کار بره(ورود به سیستم وثبت کاربران و ...) که عضوی از برنامه هست.البته اگه امکانش هست.

pouyansaraf
دوشنبه 16 خرداد 1390, 23:47 عصر
دوباره سلام
با ترکیب 2 تا background worker و یک timer همون خواسته شما درست شد
در پروژه پایین در backgroundworker 1 تابع p که متغییر i را افزایش میدهد تعریف شده است و در backgroundworker2 قفل ما چک میشود و در timer کنترل progressbar افزایش میابد
در عین اینکه ما میتوانید با TEXTBOX هم کار کنید

یادتون باشه دوستان همیشه میگن بزرگترین اشتباه اینه که lock Checke خودتون رو تو تایمر بزارین

Public Class Form1

Private i As Integer = 0

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
p()
End Sub

Private Sub p()
Threading.Thread.Sleep(100)
i += 1
If i = 100 Then
i = 1
End If
p()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label1.ResetText()
Timer1.Enabled = True
BackgroundWorker1.RunWorkerAsync()
BackgroundWorker2.RunWorkerAsync()
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
ProgressBar1.Value = i
Label1.Text = i.ToString
End Sub

Private Sub BackgroundWorker2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
Dim delay As Integer = 100000 'به طور مثال مدت زمانی که قفل طول میکشد
Threading.Thread.Sleep(delay)
Timer1.Enabled = False
MsgBox("Lock Checked")
End Sub

Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
If e.KeyValue = 13 Then
MsgBox(TextBox1.Text)
End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(TextBox1.Text)

End Sub
End Class

roxe77
سه شنبه 17 خرداد 1390, 00:40 صبح
سلام دوست عزیزم.
ببین تو ترید یا کنترل هایی امثال این نمی شه که از کنترل استفاده کرد.اما استفاده از Backgroun Worker خیلی بهتره چون اصولی تره کارش نسبت به ما.اما تو رویداد DoWork می تونی بعضی از کنترال هایی رو که فقط Get می کنی و Set نمی کنی استفاده کنی.حالا تجزیه و تحلیلش کن.
و از همه راحتر اینه که بهت می گم که برنامت لااقل قفل نمی کنه و شاید بتونی کار دیگه ای هم بکنی:


Application.DoEvents()


سوال من از شما:
قفل شما چیه؟
از کدوم شرکت؟
چند ساله باهاش کار می کنین؟


tiny
HID
منشور سیمین
2 سالی هست که کار میکنم تقریبا ازش راضی هستم فقط تو 64 بیت یکم اذیتم میکنه

nader.golab
سه شنبه 17 خرداد 1390, 14:33 عصر
خوب چون حدس می زدم برا این شرکته ازت سوال کردم.ببین برای اینکه سرعتت بالاتر بیاد باید از یک خاصیت اتصال به قفلت استفاده کنی که اینم سرعتت رو افزایش می ده و چشم گیر هستش.



Tiny1.FirstTinyHID (userKeyTXT.Text)
If Tiny1.TinyErrCode = 0 Then
ErrTXT.Text = "Error None"
Else
ErrTXT.Text = "Tiny HID Not Found ..."
End If



و وقتی وصل شد حالا هر اطلاعاتی رو که کاریش داری فقط بخون نه همشو که سرعتت بیاد پایین.بعد زمانی که وصل می شی رو بزار تو ترید و بقیه کارا که سیستم رو قفل نمی کنه حالت عادی باهاش رفتار کن.
موفق باشید.