PDA

View Full Version : مشکل در کا با CallBack ها!!!



amateur.programmer
سه شنبه 02 اسفند 1390, 16:53 عصر
سلام دوستان
من تو برنامم از CallBack استفاده می کنم
برنامه خوب کار میکنه فقط بعضی وقتا این RunTime Error رو میده:
A callback was made on a garbage collected delegate of type...
علتش اینه که delegte ای که ازش استفاده میکنم تو unmanaged Code توسط garbage collection دیسپوز(dispose) میشه.
از اساتید می خوام بپرسم چجوری delegatam رو alive نگه دارم!!! اگه اطلاعات اضافیم خواستین بگین تا بگم
با تشکر

FastCode
سه شنبه 02 اسفند 1390, 22:52 عصر
اگه اطلاعات اضافیم خواستین بگین تا بگم
با تشکر
سلام.
کد مربوطه رو اگر بزارید خیلی کمک میکنه که سریعتر حل بشه

amateur.programmer
چهارشنبه 03 اسفند 1390, 08:00 صبح
سلام دوست عزیز
من یه شبه کد از قسمتی که با callback کار کردم واسون میزارم:

public Delegate keypadcallback(int,int
public static extern int RegisterKeypadCallback(int deviceHandle, KeypadCallback callback);
class
}
main()
}
callback = new KeypadCallback(BeepCallBack);
RegisterKeypadCallback(deviceHandle,callback1);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.KeepAlive(callback1);
{

private void BeepCallBack(int deviceHandle, uint keyCode) // TODO : Use paths for drawing
{
callback1 = new KeypadCallback(beepCallback);

Invoke(callback1, deviceHandle, keyCode);

return;
}

private void beepCallback(int deviceHandle, uint keyCode) // Read and register keypad callback
{
switch (keyCode)
}
//do something
{
{

FastCode
چهارشنبه 03 اسفند 1390, 23:32 عصر
callback1 رو در سطح کلاس تعریف کنید.
KeepAlive رو بزارید قبل از Collect

amateur.programmer
پنج شنبه 04 اسفند 1390, 08:35 صبح
سلام دوست عزیز
مرسی از لطفی که کردین , البته من دیروز به جواب رسیدم ببخشید یادم رفت بگم!!!
من callback رو به صورت یه عضو private در سطح کلاس تعریف کردم و callback1 رو به صورت یه متغیر local تو تابع BeepCallBack تعریف کردم با این کار دیگه احتیاجی به استفاده از GC.keepalive و ... اینا نیست .اشتباه من این بود که callback و callback1 هردو یه مرجع داشتند.
موفق باشید