PDA

View Full Version : حرفه ای: حل مشکل تایمر



fire22
سه شنبه 13 خرداد 1393, 10:57 صبح
با سلام خدمت اساتید محترم.
دوستان یه برنامه نوشتم که باید تو بک گراند ورکر حتما تایمرم رو فعال کنم. منتها بعد کلی وقت فهمیدم که تایمر تو بک گراند ورکر اجرا نمیشه. یه نمونه ی ساده از این برنامه رو میزارم واقعا ممنون میشم بتونید راهنمایی کنید چطوری میتونم فعالش کنم.

CsharpNevisi
سه شنبه 13 خرداد 1393, 11:06 صبح
خب بجای تایمر از نخ ها استفاده کن که دیگخ نیازی هم به بگ گراند ورکر نباشه

fire22
سه شنبه 13 خرداد 1393, 11:38 صبح
خب بجای تایمر از نخ ها استفاده کن که دیگخ نیازی هم به بگ گراند ورکر نباشهداداش نمیخواستم وارد بحث Threadبشم بلدم نبودم.الانم پروزمو نوشتم فقط به این مشکل بر خوردم. لطفا اگه میتونی راهنمایی کن چطوری حلش کنم

CsharpNevisi
سه شنبه 13 خرداد 1393, 12:58 عصر
زیر کدی که مربوط به فعال سازیه تایمره یه مسیج باکس بزار ... !!!
مسیج باکس باعث میشه که وقفه بیوفته و میبینی که تا زمانی که به پایان رویداد بک گراند ورکر نرسیدیم تایمر کار میکنه ... حالا اینترول تایمرو یک کن ... !!!!
رو دکمه کلیک کن و قبل از این که مسیج باکسای تایمر نمایش داده بشن مسیج باکس بک گراند ورکرو ببند .. میبینی که تایمر اجرا نمیشه ... !!!

fire22
سه شنبه 13 خرداد 1393, 15:27 عصر
زیر کدی که مربوط به فعال سازیه تایمره یه مسیج باکس بزار ... !!!
مسیج باکس باعث میشه که وقفه بیوفته و میبینی که تا زمانی که به پایان رویداد بک گراند ورکر نرسیدیم تایمر کار میکنه ... حالا اینترول تایمرو یک کن ... !!!!
رو دکمه کلیک کن و قبل از این که مسیج باکسای تایمر نمایش داده بشن مسیج باکس بک گراند ورکرو ببند .. میبینی که تایمر اجرا نمیشه ... !!!
کاملا درسته حالا راه حل چیه؟؟ نمیتونم مسیج باکس نشون بدم که !!!. زیر همون کد خط به جای مسیجباکس از Thread.Sleep استفاده کردم اما نشد. راه حل چیه؟ چطوری میتونم مثلا بگم 5 ثانیه صبر کن تا تامیر کارشو انجام بده بعد دوباره بک گراند ورکر کار کنه؟؟!!!!!! :o

CsharpNevisi
سه شنبه 13 خرداد 1393, 15:31 عصر
اگه کارتو با ترد انجام بدی میتونم راهنمایی کنم .. ولی با بگ گراند ورکر کار نکردم تا حالا ... !!!

fire22
سه شنبه 13 خرداد 1393, 17:55 عصر
نمیدونیم چجوری باید از نخها استفاده کنم اگه میشه همون برنامه رو به جای بک گراند ورکر از نخ استفاده کن ببینم چطوریه

CsharpNevisi
سه شنبه 13 خرداد 1393, 18:31 عصر
بفرما ... بدون استفاده از بگ گراند ورکر و تایمر ... فقط و فقط با ترد ... !!!
using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;


namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
private void threadFunction()
{
Timer = new Thread(threadTimerFunction);
Timer.Start();
}
private void threadTimerFunction()
{
while (true)
{
MessageBox.Show("hi");
//افزودن اینترول
Thread.Sleep(100);
}
}


Thread MohsenFathi;
Thread Timer;

public Form1()
{
InitializeComponent();
MohsenFathi = new Thread(threadFunction);
}


private void button1_Click(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
MohsenFathi.Start();
}
}
}

fire22
سه شنبه 13 خرداد 1393, 19:07 عصر
بفرما ... بدون استفاده از بگ گراند ورکر و تایمر ... فقط و فقط با ترد ... !!!
using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;


namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
private void threadFunction()
{
Timer = new Thread(threadTimerFunction);
Timer.Start();
}
private void threadTimerFunction()
{
while (true)
{
MessageBox.Show("hi");
//افزودن اینترول
Thread.Sleep(100);
}
}


Thread MohsenFathi;
Thread Timer;

public Form1()
{
InitializeComponent();
MohsenFathi = new Thread(threadFunction);
}


private void button1_Click(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
MohsenFathi.Start();
}
}
}




داداشم اولا خط 36 چیه؟ ارور میگیره بهش چیزی باید اضافه کنم؟
دوما میشه تو بک گراند ورکرم بگم؟ MohsenFathi.Start(); ؟؟؟؟؟؟

CsharpNevisi
سه شنبه 13 خرداد 1393, 21:13 عصر
خط 36 رو که خود ویژوال استدیو پیشفرض مینویسه ... !!!!
تست نکردم ... خودت یه تستی بکن ... تو اینجا MohsenFathi به عنوان بگ کراند ورکر و Timer هم به عنوان کامپوننت تایمر کار میکنه

fire22
چهارشنبه 14 خرداد 1393, 00:32 صبح
خط 36 رو که خود ویژوال استدیو پیشفرض مینویسه ... !!!!
تست نکردم ... خودت یه تستی بکن ... تو اینجا MohsenFathi به عنوان بگ کراند ورکر و Timer هم به عنوان کامپوننت تایمر کار میکنه
سلام مشکل حل شد. تو بک گراند ورکر میشه نخ رو فعال کنی.
حالا یه سوال: چطور میتونم اون نخ رو غیر فعال کنم؟
خوندم نوشته بود با thread.Abort اما فقط thread.resetAbort داره و در ضمن کارم نمیده کلا برنامه هنگ میکنه.

fire22
چهارشنبه 14 خرداد 1393, 09:21 صبح
سلام مشکل حل شد. تو بک گراند ورکر میشه نخ رو فعال کنی.
حالا یه سوال: چطور میتونم اون نخ رو غیر فعال کنم؟
خوندم نوشته بود با thread.Abort اما فقط thread.resetAbort داره و در ضمن کارم نمیده کلا برنامه هنگ میکنه.

دوست عزیز میخوام اینجا نخ رو غیر فعال کنم چطوری باید انجامش بدم؟
وقتی دوباره میخوام نخ رو استارت کنم این ارور رو میده Thread is running or terminated; it cannot restart.

private void threadTimerFunction() {
while (true)
{

if (count % 2 == 0)
{
PortInterop.Output(888, 1);

}
else
{
PortInterop.Output(888, 0);

}
//افزودن اینترول
Thread.Sleep(intervalx);
count++;
label18.Text = count.ToString();
if (count / 2 >= xpulse)
{
MessageBox.Show("a");
count = 0;
Thread.CurrentThread.Abort();
//Thread.CurrentThread.Join();
//Thread.ResetAbort();
//this.Close();

}
}


}

NASA's Spaceman
چهارشنبه 14 خرداد 1393, 09:46 صبح
قبل از انجام کارت یه thread.stop(); بزار احتمالا مشکلت حل میشه
با سپاس Spaceman

aliagamon
چهارشنبه 14 خرداد 1393, 10:34 صبح
شما تو همون برنامه ی خودتون(اولیه که با بکگراندورکر کار کردین) .... یکبار تابع تایمر رو بعد از فعال سازیش دستی فراخوانی کنید درست میشه :

timer1.Enabled = true;
timer1_Tick(null, null);

CsharpNevisi
چهارشنبه 14 خرداد 1393, 11:31 صبح
thred.Suspend();

fire22
چهارشنبه 14 خرداد 1393, 12:19 عصر
دوستان
thread.stop(); که اصلا نداره.


thred.Suspend(); رو هم دقیقا مثل همون Thread.CurrentThread.Abort(); کار میکنه
وقتی دوباره صداش میزنم ارور زیر رو میده

Thread is running or terminated; it cannot restart

CsharpNevisi
چهارشنبه 14 خرداد 1393, 12:23 عصر
میشه فالی پروژه ت رو بزاری ؟

fire22
چهارشنبه 14 خرداد 1393, 13:19 عصر
میشه فالی پروژه ت رو بزاری ؟
تا تونستم فرم رو خلوط و خیلی چیزا رو حذف کردم. اون تایمر که نشد کلا بیخیال. فقط کافیه بتونم نخ رو غیر فعال کنم که دفه ی بعد دوباره صداش میزنم این ارورو نده
Thread is running or terminated; it cannot restart.
برنامه رو که اجرا کردی توی تکست باکس دقیقا اینو کپی کن و اون ایکون پلی را بزن بعد که تموم شد اگه دوباره روش کلیلک کنی ارور میده
"
x10 y5 f1

"
x10 y5 f1


شرط اجرا شدن نخ اینه که بخواد بره خط بعدی پس حتما باید اخر x10 y5 f1 یه اینتر بزنی.بین x10وy5 یه اسپیس وبین y5 و f1 یک اسپیس و بعد f1 هم یک اسپیس و بعد اینتر. ;) (کدهای cnc یا Mcode هستند اینا)

تو سایت اپلود نشد
اینم لینکش.
http://uploadkon.ir/fl/dd/14687
یا
http://uploadkon.ir/fl/d/MTQ2ODc%3D

CsharpNevisi
چهارشنبه 14 خرداد 1393, 13:32 عصر
من الان این کدو نوشتم مشکلی نداشت :


Thread a;


private void threadTimerFunction()
{
while (true)
{
MessageBox.Show("hi");
Thread.Sleep(2000);
a.Suspend();
}
}


public Form1()
{
InitializeComponent();
a = new Thread(threadTimerFunction);
a.Start();
}

CsharpNevisi
چهارشنبه 14 خرداد 1393, 13:38 عصر
اینم یه کد برای ساختن .. غیر فعال .. و فعال کردن نخ ... !!!!!!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;


namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{


Thread a;


private void threadTimerFunction()
{
while (true)
{
MessageBox.Show("hi");
Thread.Sleep(2000);
//غیر فعال کردن ترد
a.Suspend();
}
}


public Form1()
{
InitializeComponent();
//اجرای ترد
a = new Thread(threadTimerFunction);
a.Start();
}


private void button1_Click(object sender, EventArgs e)
{
// فعال سازی مجدد ترد
a.Resume();
}
}
}

fire22
چهارشنبه 14 خرداد 1393, 13:45 عصر
برنامه رو دان کن میفهمی چی به چیه.
با تشکر
فایل توی needfile رو توی system32 کپی کن تا ارور نده

CsharpNevisi
چهارشنبه 14 خرداد 1393, 14:02 عصر
از کجا دانلود کنم ... فایلی اتچ نکردی ک ... !!!! :لبخندساده:

fire22
چهارشنبه 14 خرداد 1393, 16:02 عصر
از کجا دانلود کنم ... فایلی اتچ نکردی ک ... !!!! :لبخندساده:
لینکشو گذاشتم بالا دیگه اینجا اتچ نشد.

http://uploadkon.ir/fl/dd/14687

یا

http://uploadkon.ir/fl/d/MTQ2ODc%3D

CsharpNevisi
چهارشنبه 14 خرداد 1393, 16:58 عصر
من اصلا نفهمیدم این برنامه قراره چیکار کنه ماهیتش چیه ... !!!
میخوایی بگو دقیقا میخوایی چیکار کنی شاید اونطوری بتونیم کمکت کنیم .. !!!

fire22
چهارشنبه 14 خرداد 1393, 17:20 عصر
من اصلا نفهمیدم این برنامه قراره چیکار کنه ماهیتش چیه ... !!!
میخوایی بگو دقیقا میخوایی چیکار کنی شاید اونطوری بتونیم کمکت کنیم .. !!!
ببین دوست عزیز این برنامه کدهایی به زبان Mcode که همون کدهای سی ان سی هستند رو میگیره و به پالس تبدیل میکنه و با پورت موازی به موتور ها در محورهای x,y,z میفرسته.
الان وقتی شما میزنی x10 یعنی 10mm در محور x ها برو که اول محاسبات رو انجام میده که کلاً چنتا پالس باید بفرسته تا 10mm ددر محور xها حرکت کنه که مقدارش در متغیر xpulse ذخیره میشه. برای y هم همینظور. در اینجا f هم سرعت هست که واحدش mm/s هست. و در متغیر pulseinsecond_x مقدار پالسایی که تو یک ثانیه باید فرستاده بشه ذخیره میشه.
گیجت نکنم
اونجایی که نوشتم threadtimer1.Start(); وارد نخ میشه و برنامه به خوبی کار میکنه.تا زمانی که همه ی پالسها فرستاده بشه بعد اومدم با دستور Thread.CurrentThread.Abort(); توی خود نخ به کار نخ پایان دادم حالا وقتشه بریم سر خط بعدی از کدهای Mcode دوباره میاد محاسباتو انجام میده و وقتی میرسه به threadtimer1.Start(); با این ارور مواجه میشم.

Thread is running or terminated; it cannot restart.
-----
خلاصه چطوری میتونم دوباره دستور
threadtimer1.Star رو اجرا کنم و با ارور
Thread is running or terminated; it cannot restart. روبه رو نشم.

aliagamon
چهارشنبه 14 خرداد 1393, 17:20 عصر
خب شما که یه پروژه رو میزاری قبلش بگو چی هست که آدم مجبور نشه 2 ساعت سورس کد بخونه تا بفهمه چی هست ... (که حالا منم نخوندم:لبخند:)...
ولی براتون همون برنامه اولی نمونه تونو درست کردم ببینید ...
بعدش هم شما خودتون به مشکل میخورین تو برنامه های تجاری.... بهتره یکم کدتونو تمیز بنویسین و درواقع اصول beautiful code رو رعایت کنید ... کامنت بزارین ... به موقع فاصله بزارین ... کلا سعی کنید یه چیزه تمیز بنویسید که در آینده خواستین بخونین به مشکل نخورید ... :لبخند:
+آپدیت :
اگر از thread میخوای استفاده کنی و به اون ارور میخوری مشکل اصلی اینه که درواقع ترد اصلا متوقف نشده که بخواد دوباره شروع به کار کنه ... شما یا اونو کلا dispose کنید یدونه دیگه بسازید یا اینکه اولین خط تابعی که ترد اجرا میکنه اینو بنویسین :thread.Suspend();
و با thread.Resume(); دوباره فراخونی کنید (هرجا قراره فراخونی بشه )

CsharpNevisi
چهارشنبه 14 خرداد 1393, 17:27 عصر
خب کدشو گذاشته بودم که ... !!!
برای متوقف کردن از

a.Suspend();

و برای شروع دوباره از

a.Resume();

استفاده کن ... !!!!