الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة مع Interrupt Handling

بدأه محمد جبر في 27 يوليو 2008 · 11 رد · 1,613 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله و بركاته الفكرة التي اريد عملها هي عدم انتظار ضغط لوحة المفاتيح لكن عمل مجموعة من العلميات بلا انقطاع او انتظار للكي بورد حتي يضغط المستخدم الكي بورد فيكون هناك هاندلر يستجيب للضغطه استخدمت دالتي setvect و getvect مستعينا بالمثال في هذه الصفحة

http://www.frontiernet.net/~fys/demoisr.htm#below

هذا هو كودي الذي لم يعمل للاسف

#include <stdio.h>
#include <dos.h>
#define kbint  0x09
#define kbport 0x60
void (interrupt far *old_isr)();
void interrupt far kbhandler()
{
char kb = inport(kbport);
if (kb == 'x')
exit(1);
}
main()
{
old_isr = getvect(kbint);
setvect(kbint,kbhandler);
while(1)
{
printf("hello\n");
delay(10000000);
}
}

اذا كان عند احدكم فكرة اخري لعمل هذا الكود فلا يبخل علي كنت قد جربت الدالة kbhit لكنها لم تفي بالمطلوب

جزاكم الله خيرا

لا اله إلا الله

#2

وضح اكثر ماذا تريد أن تفعل بالضبط.

tvquran_6.gif

#3

اخي احذف الdelay

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#4

السلام عليكم

حسب ما فهمته ، أنه يريد أن يكتب جزء من برنامج ، هذا الجزء تستطيع تغيير مسار عملياته إذا قمت بعمل input معين ،ولا يعتمد البرنامج أساسا على هذا المدخل بل يستمر في التنفيذ حتى ينتهي تماما بشكل طبيعي ، أما لو قام المستخدم بإدخال إشارة ما فإن البرنامج يستقبلها وينفذ ISR الخاص بها، (مثلا نفرض أنها لعبة كرة قدم ، فلو لم تقوم بتحريك اللاعبين من خلال لوحة المفاتيح أو أي وسيلة أخرى فلن تنتهي اللعبة ولكن ستستمر حتى تنتهي ولكن بصورة معينة ، أما لو قام المستخدم باستخدام لوحة المفاتيح لتحريك اللاعبين ، فإن مسار اللعبة سيتغير ، بسبب أن هناك جزء من البرنامج ينتظر الإشارة من لوحة المفاتيح ثم ينفذ interrupt service routine لهذه الإشارة)

هذا ما فهمته ،

أخ محمد جبر

اعتقد من سينفعك في هذه الجزئية شخص له دراية ب system programming في windows ، حيث أن هذا القسم يهتم بلغة C C++ من ناحية code writing ، هذا ما أظنه .

أعذرني فأنا أعمل linux.

كنت أتمنى أن أفيدك ، ولكني معجب جدا بمشاركتك تلك ، بقى لي فترة لم أجد مشاركة جيدة كهذه المشاركة.

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

#5

اريد ان اوضح اكثر ما يريده هو لا يُرد

while(kbhit!=0)

يعني مش عايز يستني المستخدم ، هو يريد تنفيذ عمليات اخري مع الكشف علي ضغط الزرار و هذا يحدث فقط عن طريق المقاطعات interrupts :) .

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#6

أحمد صالح ، يبدو أننا اتفقنا في طريقة الفهم.

حاول تحل هذه المشكلة ، أنت تقدر على حلها ، إنت أصلا في وسط هذه الأشياء ليل نهار ، فأنت مبرمج ألعاب :rolleyes:

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

#7

هذا مثال يفي بالغرض إن شاء الله

   #include <windows.h>#include <iostream>using namespace std;void ErrorExit(LPSTR);void KeyEventProc(KEY_EVENT_RECORD);void MouseEventProc(MOUSE_EVENT_RECORD);void ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD);int main(){    HANDLE hStdin;    DWORD cNumRead, fdwMode, fdwSaveOldMode, i;    INPUT_RECORD irInBuf[128];    int counter=0;    // Get the standard input handle.    hStdin = GetStdHandle(STD_INPUT_HANDLE);    if (hStdin == INVALID_HANDLE_VALUE)        ErrorExit(TEXT("GetStdHandle"));    // Save the current input mode, to be restored on exit.    if (! GetConsoleMode(hStdin, &fdwSaveOldMode) )        ErrorExit(TEXT("GetConsoleMode"));    // Enable the window and mouse input events.    fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;    if (! SetConsoleMode(hStdin, fdwMode) )        ErrorExit(TEXT("SetConsoleMode"));    // Loop to read and handle the input events.    while (counter++ <= 100)    {        // Wait for the events.        if (! ReadConsoleInput(                    hStdin, // input buffer handle                    irInBuf, // buffer to read into                    128, // size of read buffer                    &cNumRead) ) // number of records read            ErrorExit(TEXT("ReadConsoleInput"));        // Dispatch the events to the appropriate handler.        for (i = 0; i < cNumRead; i++)        {            switch(irInBuf.EventType)            {            case KEY_EVENT: // keyboard input                KeyEventProc(irInBuf.Event.KeyEvent);                break;            case MOUSE_EVENT: // mouse input                MouseEventProc(irInBuf.Event.MouseEvent);                break;            case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing                ResizeEventProc(                    irInBuf.Event.WindowBufferSizeEvent);                break;            case FOCUS_EVENT: // disregard focus events            case MENU_EVENT: // disregard menu events                break;            default:                ErrorExit(TEXT("Unknown event type"));                break;            }        }    }    return 0;}void ErrorExit (LPSTR lpszMessage){    cout<<stderr<<endl<< lpszMessage;    ExitProcess(0);}void KeyEventProc(KEY_EVENT_RECORD ker){    cout<<"Key event: ";    if(ker.bKeyDown) cout<<"key pressedn";    else cout<<"key releasedn";}void MouseEventProc(MOUSE_EVENT_RECORD mer){#ifndef MOUSE_HWHEELED#define MOUSE_HWHEELED 0x0008#endif    cout<<"Mouse event: ";    switch(mer.dwEventFlags)    {    case 0:        cout<<"button pressn";        break;    case DOUBLE_CLICK:        cout<<"double clickn";        break;    case MOUSE_HWHEELED:        cout<<"horizontal mouse wheeln";        break;    case MOUSE_MOVED:        cout<<"mouse movedn";        break;    case MOUSE_WHEELED:        cout<<"vertical mouse wheeln";        break;    default:        cout<<"unknownn";        break;    }}void ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD wbsr){    cout<<"Resize eventn";}

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 12 ديسمبر 2013 في 19:28 — السبب: إنقاذ الكود :)

tvquran_6.gif

#8

ما شاء الله اخي برق تفهمها و هي طارية مثل ما نقول في مصر المهمة الاساية هي لعبة snake ولكن في بيئة دوس فعلا مثل ما تقول انا وضعت سؤالي في احد منتديات برمجة انظمة التشغيل و هذا لا يمنع مشاركة احبائي هنا

اخ فهد جزاك الله خير الجزاء

اقتباس
عني مش عايز يستني المستخدم ، هو يريد تنفيذ عمليات اخري مع الكشف علي ضغط الزرار و هذا يحدث فقط عن طريق المقاطعات interrupts

هذا ما احاول عمله ها هنا عن طريق استخدام ال pic ساجرب kbhit ثانية و اوافيكم بالنتائج باذن الله

لا اله إلا الله

#9
اقتباس
pic

هل تريد تصميم لعبة السلم والثعبان على متحكم pic

اذا كان كذلك ما هى لوحة المفاتيح التى ستستخدمها

موقع البرنامج

مبارك لشعب تونس photo-thumb-42837.png

#10

لا لعبة ثعبان فقط بدون سلم

لا يهم معرفة اي شئ لان الدالتين setvect و getvect ستقومان بالمطلوب المشكلة اني لا استطيع التعامل معهما جيد احاول البحث عن دوكيمنتاشن

لا اله إلا الله

#11

ان كنت تقصد في DOS حسب ما اتذكر بدلا من استعمال setvect و getvect يمكن التغيير مباشرة ببداية الذاكرة اين يوجد جدول المقاطعات

d4baa0.gif
#12

جزاك الله خيرا اخي عبد العزيز

عملتها باسلوب اخر و لله الحمد عمل

هذه هي الفكرة

while(1)
{
m = getch();
while(!kbhit)
{
decide();
}
}
decide();
{
switch(m)
.
.
.
}

لا اله إلا الله

مواضيع مشابهة