PDA

View Full Version : سوال: کمک در رابطه با Invoke کردن



unknown.unforgiven
شنبه 11 دی 1389, 12:11 عصر
سلام به دوستان
من تو event مربوط به دریافت اطلاعات پورت سریال نمیتونم اطلاعات رو داخل richtextbox بریزم. یه کم که جست و جو کردم فهمیدم نمیشه این کار رو انجام داد مگر اینکه همون richtextbox رو تو event دریافت اطلاعات invoke کنم تا بتونم بهش دسترسی پیدا بکنم. کسی هست که بتونه invoke کردن رو به زبون ساده یه توضیحی بده که کار من رو را بندازه؟ یا اگه روش بهتری هست لطفا بگید

محسن شامحمدی
شنبه 11 دی 1389, 12:20 عصر
از این کد استفاده کنید:


void a()
{
if(this.InvokeRequired)
this.Invoke(new MethodInvoker(AddressOf a));
else
richtext1.text="barnamenevis.org";
}

پ.ن:لعنت به این تگ source

unknown.unforgiven
شنبه 11 دی 1389, 12:23 عصر
میشه یه کمی راجع به این کدی که نوشتی توضیح بدی؟

محسن شامحمدی
شنبه 11 دی 1389, 12:26 عصر
میشه یه کمی راجع به این کدی که نوشتی توضیح بدی؟
کار کرد؟
ببینید invoke یعنی اینکه از یک ترد به یکی از اجزای ترد دیگه دستور بدی.
اگر متوجه جمله بالا نشدی مشکل از شماست و باید بری دنبالش تا یاد بگیری.

ACorvinus
شنبه 11 دی 1389, 12:26 عصر
سلام به دوستان
من تو event مربوط به دریافت اطلاعات پورت سریال نمیتونم اطلاعات رو داخل richtextbox بریزم. یه کم که جست و جو کردم فهمیدم نمیشه این کار رو انجام داد مگر اینکه همون richtextbox رو تو event دریافت اطلاعات invoke کنم تا بتونم بهش دسترسی پیدا بکنم. کسی هست که بتونه invoke کردن رو به زبون ساده یه توضیحی بده که کار من رو را بندازه؟ یا اگه روش بهتری هست لطفا بگید

سلام.

منظور شمارو متوجه نشدم که میخواین چیکار کنین ولی تا اونجایی که من از تکنولوژی Invoke خبر دارم، به زبان ساده اینه که شما اسم یه روال یا تابعی (به همراه نام آرگومان های آنها) رو به همراه اینکه روال یا تابع شما در کدوم کلاس یا اسمبلی هستش، میدونین؛ و میخواین اونو اجرا کنین. منتهی نه به روش Sample گرفتن و از این حرفا. Invoke این امکان رو به شما میده که بتونین اسم روال یا تابع را به همراه آرگومانهای آن به صورت یه رشته به آرگومان Invoke بدین و ایشون اونو برای شما اجرا کنن.

نمیدونم تونستم منظورمو خوب بیان کنم یا نه. ولی اگه خواستین بگین تا یه مثال از Invoke به زبان VB و #C براتون بزارم.

موفق باشین.

unknown.unforgiven
شنبه 11 دی 1389, 12:33 عصر
کار کرد؟
ببینید invoke یعنی اینکه از یک ترد به یکی از اجزای ترد دیگه دستور بدی.
اگر متوجه جمله بالا نشدی مشکل از شماست و باید بری دنبالش تا یاد بگیری.

نه، کار نکرد:گریه: میدونم invoke کردن واسه چیه، ولی نمیدونم چه جور باید این کار رو انجام داد. و نمیدونم تو اون کدی که گذاشتی متد a چیه؟

unknown.unforgiven
شنبه 11 دی 1389, 12:37 عصر
سلام.

منظور شمارو متوجه نشدم که میخواین چیکار کنین ولی تا اونجایی که من از تکنولوژی Invoke خبر دارم، به زبان ساده اینه که شما اسم یه روال یا تابعی (به همراه نام آرگومان های آنها) رو به همراه اینکه روال یا تابع شما در کدوم کلاس یا اسمبلی هستش، میدونین؛ و میخواین اونو اجرا کنین. منتهی نه به روش Sample گرفتن و از این حرفا. Invoke این امکان رو به شما میده که بتونین اسم روال یا تابع را به همراه آرگومانهای آن به صورت یه رشته به آرگومان Invoke بدین و ایشون اونو برای شما اجرا کنن.

نمیدونم تونستم منظورمو خوب بیان کنم یا نه. ولی اگه خواستین بگین تا یه مثال از Invoke به زبان VB و #C براتون بزارم.

موفق باشین.

من میخوام یه برنامه بنویسم که وقتی رو پورت سریال اطلاعات دریافت کرد، اطلاعات رو توی richtextbox چاپ کنه، ولی وقتی توی event هستم نمیتونم این کار رو انجام بدم. به خاطر همین باید richtextbox رو یه جوری invoke کنم تا بتونم توش اطلاعات دریافتی رو چاپ کنم. اگه نمونه برنامه بزاری ممنون میشم (#C)

ACorvinus
شنبه 11 دی 1389, 16:16 عصر
من میخوام یه برنامه بنویسم که وقتی رو پورت سریال اطلاعات دریافت کرد، اطلاعات رو توی richtextbox چاپ کنه، ولی وقتی توی event هستم نمیتونم این کار رو انجام بدم. به خاطر همین باید richtextbox رو یه جوری invoke کنم تا بتونم توش اطلاعات دریافتی رو چاپ کنم. اگه نمونه برنامه بزاری ممنون میشم (#C)

سلام.

من یه مثال از #C براتون میزارم که در این مثال یه تابع به تعداد 3 بار (با آرگومان های مختلف)، Invoke میشه و هرکدوم از اونا یه عدد تصادفی بر میگردونه.

امیدوارم به دردتون بخوره.


من میخوام یه برنامه بنویسم که وقتی رو پورت سریال اطلاعات دریافت کرد

تابحال با پورت سریال کار نکردم، اگه برنامه شما جنبه حقوقی نداشته باشه، یه نمونه از اونو بذارین منم ازش یه چیزایی یاد بگیرم. بازم مشکلی بود بگین.

64401

unknown.unforgiven
شنبه 11 دی 1389, 21:20 عصر
سلام.

من یه مثال از #C براتون میزارم که در این مثال یه تابع به تعداد 3 بار (با آرگومان های مختلف)، Invoke میشه و هرکدوم از اونا یه عدد تصادفی بر میگردونه.

امیدوارم به دردتون بخوره.



تابحال با پورت سریال کار نکردم، اگه برنامه شما جنبه حقوقی نداشته باشه، یه نمونه از اونو بذارین منم ازش یه چیزایی یاد بگیرم. بازم مشکلی بود بگین.

64401

مشکل اینه که برنامه کار نمیکنه که بخوام اینجا بزارمش:گریه: با این مثال هم نتونستم کاریش بکنم. فکر کنم آخر سر مجبور بشم با تایمر کار کنم که خیلی واسه برنامه و سرعتش بد میشه:ناراحت:

ACorvinus
شنبه 11 دی 1389, 22:55 عصر
مشکل اینه که برنامه کار نمیکنه که بخوام اینجا بزارمش:گریه: با این مثال هم نتونستم کاریش بکنم. فکر کنم آخر سر مجبور بشم با تایمر کار کنم که خیلی واسه برنامه و سرعتش بد میشه:ناراحت:

متاسفانه اصلا نمیدونم روند کاریتون چیه والا کار نشد نداره. به هرحال Invokeای که گفتین روند کاریش همونی بود که توی مثالم گفتم و میشه کارای بزرگی باهاش کرد که من خودم بارها و بارها ازش استفاده کردم.

به نظر من شما یه تکه برنامه از مشکلتون رو در سایت قرار بدین تا بچه ها لمسش کنن تا بتونن جواب بدن والا اینجوری هیشکی (کسایی مثل من) از کارتون سر در نمیاره و نمیتونه کمکتون کنه. و اونوقت شاید باید راهی رو انتخاب کنین که فکر می کنین آخرین راهه و امکانش هست جواب بده ولی با بیشترین هزینه!

unknown.unforgiven
شنبه 11 دی 1389, 23:04 عصر
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
richTextBox1.Text += serialPort1.ReadExisting();
}

آخه برنامه چیزی به غیر از این نیست، یه برنامه که یه event داره، اونم واسه وقتیه که رو پورت سریال اطلاعات دریافت میکنه. ولی مشکل اینجاست که تو event نمیشه به richtextbox دسترسی پیدا کرد. اینم از خطایی که میده: Cross-thread operation not valid: Control 'richTextBox1' accessed from a thread other than the thread it was created on.

mohammadjp
شنبه 11 دی 1389, 23:29 عصر
از event زیر استفاده کنید

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)// Event for receiving data
{
this.Invoke(new EventHandler(ReadPort));
}

در تابع ReadPort که خودتان مینویسید نیز میتوانید با فراخوانی port.ReadByte() اطلاعات پورت را بخوانید و پردازش کنید

unknown.unforgiven
یک شنبه 12 دی 1389, 11:26 صبح
از event زیر استفاده کنید

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)// Event for receiving data
{
this.Invoke(new EventHandler(ReadPort));
}

در تابع ReadPort که خودتان مینویسید نیز میتوانید با فراخوانی port.ReadByte() اطلاعات پورت را بخوانید و پردازش کنید

دوست عزیز برنامه error میده:گریه:

'No overload for 'ReadPort' matches delegate 'System.EventHandler
میدونی مشکلش از چیه؟

mohammadjp
یک شنبه 12 دی 1389, 16:24 عصر
private void ReadPort(object s, EventArgs e)
{
دستورات مربوط به خواندن و پردازش اطلاعات دریافتی از پورت سریال
}

ali_13h
سه شنبه 14 دی 1389, 11:59 صبح
از این تابع استفاده کنید :
private void SetText2(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d1 = new SetTextCallback(SetText2);
this.Invoke(d1, new object[] { text });
}
else
{
textbox1.text=serialport1.readbyte.tostring();
}
البته این خط رو در متغییر های عمومی تعریف کنید :
delegate void SetTextCallback(string text);
حالا تابع رو در قسمت recivedataپورت سریال صدا بزنید

unknown.unforgiven
سه شنبه 14 دی 1389, 12:10 عصر
از این تابع استفاده کنید :
private void SetText2(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d1 = new SetTextCallback(SetText2);
this.Invoke(d1, new object[] { text });
}
else
{
textbox1.text=serialport1.readbyte.tostring();
}
البته این خط رو در متغییر های عمومی تعریف کنید :
delegate void SetTextCallback(string text);
حالا تابع رو در قسمت recivedataپورت سریال صدا بزنید


ممنون دوست عزیز، مشکلم حل شده