Qual è il modo più semplice per gestire gli eventi in C in questa situazione?

4

Sto scrivendo un gioco basato sul testo, in C. Voglio che il gioco gestisca i movimenti e le azioni degli NPC in background, mentre l'utente sta facendo le sue mosse. Utilizzerei anche eventi basati sul tempo per dire all'utente quando è mezzanotte (in tempo di gioco) o per attivare determinate cose in determinati momenti.

So che la strongzza dei Nani è tutta roba da single thread, ma non riesco a capire come sia fatto. Non so come gestisca gli eventi. Sicuramente non sta votando.

Non ho mai fatto alcuna programmazione di thread o niente con socket. Ho programmato per un po ', ma non so nulla di quelle cose.

Ho cercato su google le opzioni, ma sembra che ci sia un sacco di roba che rientra nella gestione degli eventi. Non ho idea da dove cominciare. La prima idea che mi viene in mente è avere due programmi separati che comunicano attraverso un file di testo, ma sembra una soluzione molto brutta.

Qual è la soluzione più semplice per gestire eventi come quelli che ho descritto?

Attualmente sto lavorando in Windows, ma vorrei passare a Linux se è più semplice. Mi è capitato di utilizzare una macchina Windows quando ho iniziato, quindi non importa quale.

    
posta Korgan Rivera 27.06.2015 - 05:02
fonte

2 risposte

5

È sistema operativo specifico (o specifico dell'hardware se stai codificando qualche kernel- come il software sul bare metal come un kernel del sistema operativo -vedi osdev.org -, in freestanding C). Stricto sensu probabilmente non puoi scrivere un gioco in hosting C99 ( senza usando qualsiasi libreria esterna , ad eccezione della libreria standard C utilizzando solo le poche funzioni standardizzate in C99): è necessario utilizza alcuni servizi del sistema operativo.

Mi sto concentrando su Linux nella mia risposta di seguito.

Se stai codificando su Linux (in ospitato C, come tutti i programmi utente), codifichi il tuo event loop attorno a un multiplexing syscall come sondaggio (2) (o forse il precedente select(2) , che di solito non consiglio, vedi anche epoll (7) ). Leggi il problema C10K . Potresti utilizzare una libreria di loop di eventi come libev o libevent .

Se non conosci la maggior parte delle syscalls Linux (elencate in syscalls (2) ...), leggi Programmazione Linux avanzata .

Leggere e interrogare il terminale è complicato su Linux (perché tty -s sono piuttosto complessi). Probabilmente vorrai utilizzare qualche libreria, come ncurses , per creare un'applicazione terminale.

Se desideri codificare un'applicazione GUI, utilizzerai praticamente alcuni toolkit framework come Qt o Gtk (o libsdl ). Forniscono un ciclo degli eventi e dovrai registrare le callback (leggi anche continuazioni , è un concetto pertinente).

Se desideri comunicare due programmi (scritti da te), dovrai utilizzare alcuni IPC macchinari, in particolare pipe (7) -s. Probabilmente avrai bisogno di un loop di eventi in alcuni (o entrambi).

Per i problemi relativi al tempo, sondaggio (2) (quindi tutto il ciclo degli eventi librerie costruite sopra di esso) viene dato un ritardo. Vedi anche orario (7) .

Non consiglio di utilizzare signal (7) -s nel tuo caso (I segnali sono un'interruzione come l'astrazione fornita dal sistema operativo, in particolare POSIX quelli). Se lo fai, stai molto attento, è difficile. Un gestore di segnale può solo chiamare pochissime funzioni di sicurezza del segnale asincrono, e il solito modo è spesso di impostare semplicemente un% flag% di memoria in esso, da testare e resettare all'interno del ciclo degli eventi. Vedi anche concetti di segnale POSIX capitolo.

Se stai codificando su un sistema operativo non- POSIX come Windows, devi imparare come scrivere loop di eventi su di esso, e qual è l'API di sistema di basso livello. Probabilmente troverai una libreria per questo. Esistono alcune librerie (ad es. Qt & POCO - sia per che in C ++) che sono multipiattaforma. La programmazione Windows è molto diversa dalla programmazione POSIX, non ne so nulla.

    
risposta data 27.06.2015 - 07:12
fonte
0

La soluzione più semplice è utilizzare interrupt e timer.

Gli interrupt indicano:

  1. Input I / O utente
  2. Scadenza del timer

Due programmi separati potrebbero comunicare tramite due pipe o msgsnd() o semafori o mutex o segnali.

(Penso che non ci sia bisogno di più programmi.)

Se si scrive il programma in modo che tutto sia guidato da interrupt, insieme a un'attività di 'background' in esecuzione quando nessun interrupt viene servito. Quindi il programma dovrebbe essere 'relativamente' facile da implementare.

Qualche esperienza con il programma incorporato in tempo reale ti aiuterà molto nella progettazione, nella codifica, nel debug e nella documentazione del programma.

    
risposta data 27.06.2015 - 05:12
fonte

Leggi altre domande sui tag