PDA

View Full Version : سوال: انتظار برای ادامه برنامه بدون sleep



mohammadali1375
پنج شنبه 23 آذر 1391, 20:35 عصر
سلام.
من یک مشکلی دارم. البته میشه حلش کرد ولی خیل قشنگ نمیشه.
ببینید فرض کنید من یه تابع دارم
void abc()
بعد یه برنامه به این شکل دارم

do sth
do sth
wait 1 second
abc()
do sth
do sth

فرض اون do sth های مثلا یک دستوری چیزی باشند. حالا میخام خط بعد از wait 1 second یک ثانیه بعد اجرا بشه اما روی اون wait 1 second گیر نکنه و خط های بعد رو اجرا کنه اما یک ثانیه بعد هم تابع abc رو اجرا کنه.
چی کار کنم ؟

ordebehesht
پنج شنبه 23 آذر 1391, 20:52 عصر
فکر کنم باید اختلاف زمانی دو لحظه رو پیدا کنی حالا و یک دقیقه بعد

ali_kolahdoozan
پنج شنبه 23 آذر 1391, 20:57 عصر
Application.doevent

farhadt
پنج شنبه 23 آذر 1391, 20:57 عصر
از Timer استفاده کنید.

ordebehesht
پنج شنبه 23 آذر 1391, 20:59 عصر
Application.doevent

از توضیحات کافی شما کمال تشکر دارم بنده خوب خدا این دیگه چیه من که دارم 5 یا 6 سال برنامه نویسی میکنم هنگیدم واب بحال تازه کارا قصدم جسارت نیست

مهرداد صفا
پنج شنبه 23 آذر 1391, 21:03 عصر
سلام

//گرفتن tickcount که هزارم ثانیه هاییست که سیستم روشن است و ذخیره در متغیر
int StartTime = Environment.TickCount;
//تازمانی ه یک ثانیه نگذشته
while (StartTime > Environment.TickCount-1000)
{
//دیگر رویدادها را اجرا کن
Application.DoEvents();
}

H_G_G_I
پنج شنبه 23 آذر 1391, 21:09 عصر
جواب درست بدین اینا چیه اها !:قهقهه:

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Console.WriteLine("1");
Console.WriteLine("2");
Console.WriteLine("3");
Thread th = new Thread(new ThreadStart(Thread_01), 1024);
th.Start();
Console.WriteLine("4");
Console.WriteLine("5");
Console.ReadLine();

}

static void Thread_01()
{
Thread.Sleep(3000);
Console.WriteLine("tt");
Console.WriteLine("tt");
}
}

ordebehesht
پنج شنبه 23 آذر 1391, 21:09 عصر
من علط کنم همچین اشتباه بزرگی بکنم دوست من شما استادی من که گفتم هنگم هنوزم هنگم توضیحش دست خودتو می بوسه

mohammadali1375
پنج شنبه 23 آذر 1391, 21:11 عصر
از همه منمون. خودم با یک چیزی که شبیه کد دوستمون M.safa بود درستش کردم ولی میخام یکم جم و جور تر باشه . مثلا مثل این :
waitforseconds(2,abc);
قبلا یه چیزی مثل این دیده بودم ولی یادم نیست کجا :گریه:

ali_kolahdoozan
پنج شنبه 23 آذر 1391, 21:12 عصر
از همه منمون. خودم با یک چیزی که شبیه کد دوستمون M.safa بود درستش کردم ولی میخام یکم جم و جور تر باشه . مثلا مثل این :
waitforseconds(2,abc);
قبلا یه چیزی مثل این دیده بودم ولی یادم نیست کجا :گریه:


ایراد بنی اسرائیلی ؟؟؟؟؟ . فوقش خودت یک متد بنویس دیگه . جمع و جور دیگه چه صیغه ای است ؟

mohammadali1375
پنج شنبه 23 آذر 1391, 21:13 عصر
آخه دیدمش . ولی نمیدونم کجا . خودم هم الان یکی نوشتم ولی گفتم دوباره کاری نشه

ali_kolahdoozan
پنج شنبه 23 آذر 1391, 21:15 عصر
آخه دیدمش . ولی نمیدونم کجا . خودم هم الان یکی نوشتم ولی گفتم دوباره کاری نشه


سر همون یک کلمه Doevents رو میگرفتی و میرفتی ، کارت حل میشد . آخرم داستان با همون میشه

ordebehesht
پنج شنبه 23 آذر 1391, 21:18 عصر
جواب درست بدین اینا چیه اها !:قهقهه:

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Console.WriteLine("1");
Console.WriteLine("2");
Console.WriteLine("3");
Thread th = new Thread(new ThreadStart(Thread_01), 1024);
th.Start();
Console.WriteLine("4");
Console.WriteLine("5");
Console.ReadLine();

}

static void Thread_01()
{
Thread.Sleep(3000);
Console.WriteLine("tt");
Console.WriteLine("tt");
}
}

این کد چند نخی رو نشون میده نمیدونم به مفهوم چند نخی آشنایی داری یا نه تا خط 11 برنامه اجرا شد و در خط 12و 13از کلاس tread نمونه سازی کرد و نام یه تابع رو به عنوان ورودی ارسال کرد در خط بعدش همون تابع رو شروع کرد به کار اما تابع در خط 22 به مدت 3000میلی ثانیه مسدود شده
منم زیاد کار نکردم تا این حد بلدم امید دارم دوستان نوشته هامو تکمیل اشتباهام تصحیح کنن

mohammadali1375
پنج شنبه 23 آذر 1391, 21:20 عصر
سر همون یک کلمه Doevents رو میگرفتی و میرفتی ، کارت حل میشد . آخرم داستان با همون میشه

تو فرم نمینویسم.

ali_kolahdoozan
پنج شنبه 23 آذر 1391, 21:21 عصر
تو فرم نمینویسم.

نفهمیدم چی گفتی شما !

H_G_G_I
پنج شنبه 23 آذر 1391, 21:43 عصر
بفرما ! اینم اون مدلی که شما می خواین . البته یکم باید خودت بهینه ترش کنی .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApplication1
{
static class Program
{
[STAThread]
static void Main()
{
Console.WriteLine("1");
Console.WriteLine("2");
Console.WriteLine("3");

Caller.DoAfter(myFanc1, 1000);
Caller.DoAfter(myFanc2, 3000);
Caller.DoAfter(myFanc3, 2000);

for (int i = 0; i < 16; i++)
{
Console.WriteLine("4");
Thread.Sleep(600);
}

Console.ReadLine();

}

static void myFanc1()
{
Console.WriteLine("func1");
}
static void myFanc2()
{
Console.WriteLine("func2");
}
static void myFanc3()
{
Console.WriteLine("func3");
}

class Caller
{
static Thread[] threads = new Thread[4];
static ThreadStart[] ths = new ThreadStart[4];
static int[] delays = new int[4];
static int curInd = 0;

public static void DoAfter(ThreadStart _ts, int _delay)
{
if (curInd >= 4)
{
curInd = 0;
return;
}

delays[curInd] = _delay;
ths[curInd] = _ts;

switch (curInd)
{
case 0:
threads[0] = new Thread(new ThreadStart(Thread_0), 32);
break;

case 1:
threads[1] = new Thread(new ThreadStart(Thread_1), 32);
break;

case 2:
threads[2] = new Thread(new ThreadStart(Thread_2), 32);
break;

case 3:
threads[3] = new Thread(new ThreadStart(Thread_3), 32);
break;
}

threads[curInd].Start();

curInd++;
}

private static void Thread_0()
{
Thread.Sleep(delays[0]);
ths[0]();
threads[0].Abort();
}
private static void Thread_1()
{
Thread.Sleep(delays[1]);
ths[1]();
threads[1].Abort();
}
private static void Thread_2()
{
Thread.Sleep(delays[2]);
ths[2]();
threads[2].Abort();
}
private static void Thread_3()
{
Thread.Sleep(delays[3]);
ths[3]();
threads[3].Abort();
}
}
}
}