PDA

View Full Version : حرفه ای: مشکل با thread و فراخوانی sendmessage



JikSearch
دوشنبه 07 آذر 1390, 12:51 عصر
سلام
داخل ترد نمیشه این کار را انجام داد، چطور باید اصلاحش کنم؟
هر راهنمایی بفرمائید ممنون میشم


public int WM_SYSCOMMAND = 0x0112;
public int SC_MONITORPOWER = 0xF170; //Using the system pre-defined MSDN constants that can be used by the SendMessage() function .
[DllImport("user32.dll")]
private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);

private void Form1_Load(object sender, EventArgs e)
{
new Thread(new ThreadStart(Sleep_Time)).Start();
}

public void Sleep_Time()
{
DateTime dt06AM = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 6, 1, 0);

while (true)
{

if (DateTime.Now < dt06AM)
{
//turn_off_display();
SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}
Thread.Sleep(50000);
}
}

Amir Oveisi
دوشنبه 07 آذر 1390, 17:21 عصر
توی متدتون داخل if‌ رو به این شکل تغییر بدید:

if (DateTime.Now < dt06AM)
{
//turn_off_display();
if (this.InvokeRequired)
this.Invoke(new MethodInvoker(delegate() { SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, 2); }));
else
SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}

exception‌ ای رخ میده به این دلیل هست که شما میخواید از طریق thread ای که سازنده یک object نبوده؛ به اون object‌دسترسی داشته باشید. یعنی از طریق thread‌جدیدی که ساختید میخواستید به this (که توسط thread‌اصلی برنامه ساخته شده) دسترسی داشته باشید که در حالت عادی نمیشه.
هر thread‌به object هایی دسترسی داره که خودش ایجادشون کرده باشه.

JikSearch
سه شنبه 08 آذر 1390, 06:58 صبح
بسیار ممنون
درست شد، خیلی لطف کردید


برای استفاده دوستان:
این کد مانیتور را در زمان مورد نظر خاموش می کند