PDA

View Full Version : حرفه ای: عدم Open شدن Line در Thread - تلفن گویا



mohammad.sakhidel
سه شنبه 03 فروردین 1389, 11:38 صبح
سلام به همگی. سال نو تون مبارک
دوستان من برنامه تلفن گویایی دارم مینویسم که در قسمت تنظیماتش کاربر میتونه یه زمان خاصی رو برای فعالسازی خودکار برنامه تعیین کنه.
یعنی از اون ساعت خاص برنامه به مودم وصل شه و تلفن هارو جواب بده.
برای اینکار از یک ترد استفاده میکنم که با یه حلقه بی پایان چک میکنه که هروقت توی اون بازه زمانی بود ، سیستم رو فعال کنه. تا اینجا هیچ مشکلی نیست.
برای باز کردن لاین و اتصال به مودم از یه دلیگیت که متد زیر رو اجرا میکنه استفاده میکنم :



public bool OpenLine(TelSettings Settings)
{
bool res = false;
try
{
currentLine = tapiexCtrl.GetLineFromDeviceID(Settings.ModemToCon nect.DeviceId);
if (currentLine.Open())
res = true;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
return res;
}


من مطمئنم که این متد ایرادی نداره چون برای فعال کردن دستی سیستم هم از همین متد و دلیگیت مربوطش استفاده می کنم جواب میده.

در کد بالا اگه دقت کنین میبینین که متد یه خروجی bool داره که اگه لاین باز شد true میشه ، فقط چیزی که هست اینه که ،این متغییر bool ما true میشه ولی لاین باز نمیشه:متفکر::متفکر:
کسی چیزی به ذهنش میرسه؟؟




-----------------------------------------------------------------
بازار مرزی ایرانیان :: تجربه یک خرید ارزان و با کیفیت (http://www.bazaremarzi.com)

FastCode
سه شنبه 03 فروردین 1389, 12:17 عصر
if (currentLine.Open())
res = true;

//-->


bool k = currentLine.Open();
if(k) res = true;

mohammad.sakhidel
سه شنبه 03 فروردین 1389, 12:28 عصر
دوست عزیز چه فرقی میکنن اینا؟؟
هیچی باور کن فرقی ندارن.
گفتم که اون کد بالا مشکلی نداره ، برای اینکه وقتی بصورت دستی و با کلیک یک باتن همین کد هارو اجرا میکنم کاملا درسته :متعجب:

FastCode
چهارشنبه 04 فروردین 1389, 02:03 صبح
دوست عزیز چه فرقی میکنن اینا؟؟
هیچی باور کن فرقی ندارن.
گفتم که اون کد بالا مشکلی نداره ، برای اینکه وقتی بصورت دستی و با کلیک یک باتن همین کد هارو اجرا میکنم کاملا درسته :متعجب:

خیلی فرق دارن.باور کن.

کد call کردن Delegate رو اگر بزاری خیلی بهتر میشه.

mohammad.sakhidel
چهارشنبه 04 فروردین 1389, 10:45 صبح
تمام کد ها رو میذارم اینجا ، امیدوارم دوستان و مدیرا کمک کنن.
کدی که در رویداد Load فرم اجرا میشه و ترد رو استارتش میکنه :


th_Activation = new Thread(new ThreadStart(TH_Activation));
th_Activation.IsBackground = true;
th_Activation.Start();و این متدی هست که ترد اجرا میکنه :


private void TH_Activation()
{
try
{
GetSettingsCallBack Del_GetSettings = new GetSettingsCallBack(GetSettings);
TelSettings settings = (TelSettings)this.Invoke(Del_GetSettings);
bool auto_Enabled = settings.AutoActivate;
Time auto_Begin = settings.AutoActivateBeginTime;
Time auto_End = settings.AutoActivateEndTime;
E_DayTypes auto_DayType = settings.AutoActivateDayType;
if (auto_Enabled)
{
Date today = MyCodes.DateString_2_Date(Shamsi.MiladiToShamsi(Da teTime.Now), '/');
if (IsValidDay(today, auto_DayType))
{
while (true)
{
Time now = new Time(DateTime.Now);
TimeSpan ts_WithBegin = now.GetDateTime() - auto_Begin.GetDateTime();
TimeSpan ts_WithEnd = auto_End.GetDateTime() - now.GetDateTime() ;
if ((ts_WithBegin.TotalMinutes >= 0) && (ts_WithEnd.TotalMinutes >= 0) && (systemStatus == E_SystemActivationStatus.DeActivated))
{
// activation codes :
OpenLineCallBack del_OpenLine = new OpenLineCallBack(OpenLine);
bool lineOpened = (bool)this.Invoke(del_OpenLine, new object[] { settings});
if (lineOpened)
{
conected = true;
systemStatus = E_SystemActivationStatus.Activated;
SetLabelTextCallBack del_SetLabelText = new SetLabelTextCallBack(SetLabelText);
this.Invoke(del_SetLabelText, new object[] { lbl_Status, "فعال"});
SetButtonTextCallBack del_SetButtonText = new SetButtonTextCallBack(SetButtonText);
this.Invoke(del_SetButtonText, new object[] { btn_Connect, "غیر فعال شود" });
SetLabelColorCallBack del_SetLabelColor = new SetLabelColorCallBack(SetLabelColor);
this.Invoke(del_SetLabelColor, new object[] { lbl_Status, Color.Navy});
}
}
else if (((ts_WithBegin.TotalMinutes < 0) || (ts_WithEnd.TotalMinutes < 0)) && (systemStatus == E_SystemActivationStatus.Activated))
{
// Deactivation Codes :
CloseLineCallBack del_CloseLine = new CloseLineCallBack(CloseLine);
bool lineClosed = (bool)this.Invoke(del_CloseLine);
if (lineClosed)
{
systemStatus = E_SystemActivationStatus.DeActivated;
conected = false;
SetLabelTextCallBack del_SetLabelText = new SetLabelTextCallBack(SetLabelText);
this.Invoke(del_SetLabelText, new object[] { lbl_Status, "غیر فعال" });
SetButtonTextCallBack del_SetButtonText = new SetButtonTextCallBack(SetButtonText);
this.Invoke(del_SetButtonText, new object[] { btn_Connect, "فعال شود" });
SetLabelColorCallBack del_SetLabelColor = new SetLabelColorCallBack(SetLabelColor);
this.Invoke(del_SetLabelColor, new object[] { lbl_Status, Color.Gray });
}
}
}
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}و اینم دو تا متدی که برای باز و بسته کردن لاین استفاده کردم :


public bool CloseLine()
{
bool res = false;
try
{
if (currentLine.Close())
{
res = true;
}
}
catch
{
}
return res;
}

public bool OpenLine(TelSettings Settings)
{
bool res = false;
try
{
currentLine = tapiexCtrl.GetLineFromDeviceID(Settings.ModemToCon nect.DeviceId);
currentLine.Open();
if (currentLine.Opened)
res = true;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
return res;
}قسمت های اصلی کد ایناست.
توضیح :


دلیگیت GetSettingsCallBack شی ای رو برمیگردونه که حاوی تنظیمات سیستم هست.



متغیر های auto_Begin و auto_End زمان شروع و پایان فعالسازی خودکار برنامه هستن.



شی های Time و Date رو خودم ایجاد کردم و بجای DateTime استفاده میکنم چون با DateTime در تاریخ شمسی با مشکل مواجه شدم.



متد IsValidDay چک میکنه ببینه که آیا امروز تعطیل و روز غیر کاری نباشه(تست شده و درست کار میکنه)



متغیر systemStatus یک enum هست که وضعیت جاری سیستم رو در خود نگه میداره (فعال یا غیر فعال)





-----------------------------------------------------------------
بازار مرزی ایرانیان :: تجربه یک خرید ارزان و با کیفیت (http://www.bazaremarzi.com)

mohammad.sakhidel
چهارشنبه 04 فروردین 1389, 12:03 عصر
دوستان مشکل جای دیگه ای بود. حل شد. :اشتباه: :لبخند:




-----------------------------------------------------------------
بازار مرزی ایرانیان :: تجربه یک خرید ارزان و با کیفیت (http://www.bazaremarzi.com)

kazem235
دوشنبه 24 تیر 1392, 19:49 عصر
بازار مرزی ایرانیان :: تجربه یک خرید ارزان و با کیفیت (http://www.bazaremarzi.com)[/QUOTE]
لینکت مشکل داره.