OOP: obalující třída pro práci s frontou
authorFrantišek Kučera <franta-hg@frantovo.cz>
Tue, 07 Apr 2009 01:16:04 +0200
changeset 6617fef4676b9
parent 5 a6822e6dd2ca
child 7 cd5d8916d983
OOP: obalující třída pro práci s frontou
c++/POSIXoveFronty/Fronta/Fronta.pro
c++/POSIXoveFronty/Fronta/Makefile
c++/POSIXoveFronty/Fronta/fronta.cpp
c++/POSIXoveFronty/Fronta/fronta.h
c++/POSIXoveFronty/Fronta/program.cpp
c++/POSIXoveFronty/Fronta/program.h
     1.1 --- a/c++/POSIXoveFronty/Fronta/Fronta.pro	Sun Apr 05 22:02:15 2009 +0200
     1.2 +++ b/c++/POSIXoveFronty/Fronta/Fronta.pro	Tue Apr 07 01:16:04 2009 +0200
     1.3 @@ -1,12 +1,12 @@
     1.4  ######################################################################
     1.5 -# Automatically generated by qmake (2.01a) p dub 3 18:45:01 2009
     1.6 +# Automatically generated by qmake (2.01a) ne dub 5 22:16:46 2009
     1.7  ######################################################################
     1.8  
     1.9  TEMPLATE = app
    1.10  TARGET = 
    1.11 -DEPENDPATH += .
    1.12 +DEPENDPATH += . qtc-gdbmacros
    1.13  INCLUDEPATH += .
    1.14  
    1.15  # Input
    1.16 -HEADERS += program.h
    1.17 -SOURCES += program.cpp
    1.18 +HEADERS += fronta.h program.h
    1.19 +SOURCES += fronta.cpp program.cpp qtc-gdbmacros/gdbmacros.cpp
     2.1 --- a/c++/POSIXoveFronty/Fronta/Makefile	Sun Apr 05 22:02:15 2009 +0200
     2.2 +++ b/c++/POSIXoveFronty/Fronta/Makefile	Tue Apr 07 01:16:04 2009 +0200
     2.3 @@ -1,9 +1,9 @@
     2.4  #############################################################################
     2.5  # Makefile for building: Fronta
     2.6 -# Generated by qmake (2.01a) (Qt 4.4.3) on: so dub 4 22:38:33 2009
     2.7 +# Generated by qmake (2.01a) (Qt 4.4.3) on: ne dub 5 22:16:48 2009
     2.8  # Project:  Fronta.pro
     2.9  # Template: app
    2.10 -# Command: /usr/bin/qmake-qt4 -spec /usr/share/qt4/mkspecs/linux-g++ -unix -o Makefile Fronta.pro
    2.11 +# Command: /usr/bin/qmake -unix -o Makefile Fronta.pro
    2.12  #############################################################################
    2.13  
    2.14  ####### Compiler, tools and options
    2.15 @@ -19,7 +19,7 @@
    2.16  LIBS          = $(SUBLIBS)  -L/usr/lib -lQtGui -lQtCore -lpthread
    2.17  AR            = ar cqs
    2.18  RANLIB        = 
    2.19 -QMAKE         = /usr/bin/qmake-qt4
    2.20 +QMAKE         = /usr/bin/qmake
    2.21  TAR           = tar -cf
    2.22  COMPRESS      = gzip -9f
    2.23  COPY          = cp -f
    2.24 @@ -42,8 +42,12 @@
    2.25  
    2.26  ####### Files
    2.27  
    2.28 -SOURCES       = program.cpp 
    2.29 -OBJECTS       = program.o
    2.30 +SOURCES       = fronta.cpp \
    2.31 +		program.cpp \
    2.32 +		qtc-gdbmacros/gdbmacros.cpp 
    2.33 +OBJECTS       = fronta.o \
    2.34 +		program.o \
    2.35 +		gdbmacros.o
    2.36  DIST          = /usr/share/qt4/mkspecs/common/g++.conf \
    2.37  		/usr/share/qt4/mkspecs/common/unix.conf \
    2.38  		/usr/share/qt4/mkspecs/common/linux.conf \
    2.39 @@ -114,7 +118,7 @@
    2.40  		/usr/share/qt4/mkspecs/features/lex.prf \
    2.41  		/usr/lib/libQtGui.prl \
    2.42  		/usr/lib/libQtCore.prl
    2.43 -	$(QMAKE) -spec /usr/share/qt4/mkspecs/linux-g++ -unix -o Makefile Fronta.pro
    2.44 +	$(QMAKE) -unix -o Makefile Fronta.pro
    2.45  /usr/share/qt4/mkspecs/common/g++.conf:
    2.46  /usr/share/qt4/mkspecs/common/unix.conf:
    2.47  /usr/share/qt4/mkspecs/common/linux.conf:
    2.48 @@ -136,11 +140,11 @@
    2.49  /usr/lib/libQtGui.prl:
    2.50  /usr/lib/libQtCore.prl:
    2.51  qmake:  FORCE
    2.52 -	@$(QMAKE) -spec /usr/share/qt4/mkspecs/linux-g++ -unix -o Makefile Fronta.pro
    2.53 +	@$(QMAKE) -unix -o Makefile Fronta.pro
    2.54  
    2.55  dist: 
    2.56  	@$(CHK_DIR_EXISTS) .tmp/Fronta1.0.0 || $(MKDIR) .tmp/Fronta1.0.0 
    2.57 -	$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents program.h .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents program.cpp .tmp/Fronta1.0.0/ && (cd `dirname .tmp/Fronta1.0.0` && $(TAR) Fronta1.0.0.tar Fronta1.0.0 && $(COMPRESS) Fronta1.0.0.tar) && $(MOVE) `dirname .tmp/Fronta1.0.0`/Fronta1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/Fronta1.0.0
    2.58 +	$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents fronta.h program.h .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents fronta.cpp program.cpp qtc-gdbmacros/gdbmacros.cpp .tmp/Fronta1.0.0/ && (cd `dirname .tmp/Fronta1.0.0` && $(TAR) Fronta1.0.0.tar Fronta1.0.0 && $(COMPRESS) Fronta1.0.0.tar) && $(MOVE) `dirname .tmp/Fronta1.0.0`/Fronta1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/Fronta1.0.0
    2.59  
    2.60  
    2.61  clean:compiler_clean 
    2.62 @@ -180,9 +184,15 @@
    2.63  
    2.64  ####### Compile
    2.65  
    2.66 +fronta.o: fronta.cpp fronta.h
    2.67 +	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o fronta.o fronta.cpp
    2.68 +
    2.69  program.o: program.cpp program.h
    2.70  	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o program.o program.cpp
    2.71  
    2.72 +gdbmacros.o: qtc-gdbmacros/gdbmacros.cpp 
    2.73 +	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o gdbmacros.o qtc-gdbmacros/gdbmacros.cpp
    2.74 +
    2.75  ####### Install
    2.76  
    2.77  install:   FORCE
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/c++/POSIXoveFronty/Fronta/fronta.cpp	Tue Apr 07 01:16:04 2009 +0200
     3.3 @@ -0,0 +1,66 @@
     3.4 +#include <fronta.h>
     3.5 +#include <iostream>
     3.6 +
     3.7 +using namespace std;
     3.8 +
     3.9 +Fronta::Fronta() {
    3.10 +    prijimaci = false;
    3.11 +    odesilaci = false;
    3.12 +    otevrena = false;
    3.13 +}
    3.14 +
    3.15 +Fronta::Fronta(char* nazev, bool prijimaci, bool odesilaci) {
    3.16 +    this->nazev = nazev;
    3.17 +    this->prijimaci = prijimaci;
    3.18 +    this->odesilaci = odesilaci;
    3.19 +
    3.20 +    /** Nastavíme vlastnosti fronty */
    3.21 +    mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE;
    3.22 +    mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY;
    3.23 +
    3.24 +    /** Vytvoříme odesílací (obojetnou) nebo (pouze) čtecí frontu */
    3.25 +    if (odesilaci) {
    3.26 +        fronta = mq_open(nazev, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti);
    3.27 +        otevrena = true;
    3.28 +    } else if (prijimaci) {
    3.29 +        fronta = mq_open(nazev, O_RDONLY);
    3.30 +        otevrena = true;
    3.31 +    } else {
    3.32 +        otevrena = false;
    3.33 +    }
    3.34 +}
    3.35 +
    3.36 +int Fronta::odesliZpravu(char* zprava) {
    3.37 +    if (otevrena && odesilaci) {
    3.38 +        return mq_send(fronta, zprava, strlen(zprava) + 1, 0);
    3.39 +    } else {
    3.40 +        return -1;
    3.41 +    }
    3.42 +}
    3.43 +
    3.44 +char* Fronta::prijmiZpravu() {
    3.45 +    if (otevrena && prijimaci) {
    3.46 +        char zprava[DELKA_ZPRAVY + 1];
    3.47 +        zprava[DELKA_ZPRAVY] = '\0';
    3.48 +        if (mq_receive(fronta, zprava, DELKA_ZPRAVY, NULL) > 0) {
    3.49 +            return zprava;
    3.50 +        } else {
    3.51 +            return NULL;
    3.52 +        }
    3.53 +    } else {
    3.54 +        return NULL;
    3.55 +    }
    3.56 +}
    3.57 +
    3.58 +void Fronta::zavriFrontu(bool zrusit) {
    3.59 +    if (otevrena) {
    3.60 +        if (zrusit) {
    3.61 +            mq_unlink(nazev);
    3.62 +        }
    3.63 +        mq_close(fronta);
    3.64 +        otevrena = false;
    3.65 +    }
    3.66 +}
    3.67 +
    3.68 +
    3.69 +
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/c++/POSIXoveFronty/Fronta/fronta.h	Tue Apr 07 01:16:04 2009 +0200
     4.3 @@ -0,0 +1,42 @@
     4.4 +#ifndef _FRONTA_H
     4.5 +#define	_FRONTA_H
     4.6 +
     4.7 +#include <string.h>
     4.8 +#include <mqueue.h>
     4.9 +
    4.10 +/**
    4.11 + * Objektový obal pro POSIXovou frontu (mq).
    4.12 + */
    4.13 +class Fronta {
    4.14 +public:
    4.15 +    /** Vytvoří frontu (zapisovací umí i číst). */
    4.16 +    Fronta(char*, bool, bool);
    4.17 +    Fronta();
    4.18 +    /** Přidá zprávu do fronty. */
    4.19 +    int odesliZpravu(char*);
    4.20 +    /** Načte jednu zprávu z fronty. V případě chyby vrací NULL */
    4.21 +    char* prijmiZpravu();
    4.22 +    /** Zavře frontu. true = zruší frontu.*/
    4.23 +    void zavriFrontu(bool);
    4.24 +
    4.25 +private:
    4.26 +    char* nazev;
    4.27 +    bool prijimaci;
    4.28 +    bool odesilaci;
    4.29 +    bool otevrena;
    4.30 +    mqd_t fronta;
    4.31 +
    4.32 +    /** Vlastnosti fronty */
    4.33 +    struct mq_attr mq_vlastnosti;
    4.34 +
    4.35 +    /** Maximální počet zpráv ve frontě (potom začne blokovat) */
    4.36 +    static const int POCET_ZPRAV_VE_FRONTE = 5;
    4.37 +
    4.38 +    /** Délka jedné zprávy ve frontě */
    4.39 +    static const int DELKA_ZPRAVY = 100;
    4.40 +
    4.41 +
    4.42 +};
    4.43 +
    4.44 +#endif	/* _FRONTA_H */
    4.45 +
     5.1 --- a/c++/POSIXoveFronty/Fronta/program.cpp	Sun Apr 05 22:02:15 2009 +0200
     5.2 +++ b/c++/POSIXoveFronty/Fronta/program.cpp	Tue Apr 07 01:16:04 2009 +0200
     5.3 @@ -6,9 +6,11 @@
     5.4  #include <program.h>
     5.5  #include <stdlib.h>
     5.6  #include <iostream>
     5.7 -#include <mqueue.h>
     5.8  #include <readline/readline.h>
     5.9  #include <signal.h>
    5.10 +#include <strings.h>
    5.11 +
    5.12 +#include "fronta.h"
    5.13  
    5.14  using namespace std;
    5.15  
    5.16 @@ -23,9 +25,9 @@
    5.17      signal(SIGTERM, zpracujSignal);
    5.18      signal(SIGINT, zpracujSignal);
    5.19  
    5.20 -    /** Nastavíme vlastnosti fronty */
    5.21 -    mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE;
    5.22 -    mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY;
    5.23 +    /** TODO: zeptat se na název fronty */
    5.24 +    //strcpy(nazevFronty, VYCHOZI_NAZEV_FRONTY);
    5.25 +    nazevFronty = "/mojeFronta";
    5.26  
    5.27      /** Program pracuje buď v režimu přijímání nebo odesílání */
    5.28      if (isOdesilaciRezim()) {
    5.29 @@ -34,7 +36,9 @@
    5.30          prijimej();
    5.31      }
    5.32  
    5.33 -    /** Sem se nedostaneme – program končí, až když dostane patřičný signál. */
    5.34 +    fronta.zavriFrontu(false);
    5.35 +
    5.36 +    /** Sem se nedostaneme, pokud metody poběží v cyklu – program končí, až když dostane patřičný signál. */
    5.37      return (EXIT_SUCCESS);
    5.38  }
    5.39  
    5.40 @@ -56,34 +60,29 @@
    5.41  
    5.42  void odesilej() {
    5.43      cout << "Odesíláme…" << endl;
    5.44 +    fronta = Fronta(nazevFronty, false, true);
    5.45  
    5.46 -    mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti);
    5.47 -
    5.48 +    /** TODO: načíst ze standardního vstupu */
    5.49      char zprava[] = "zpráva";
    5.50  
    5.51 -    int vysledek = mq_send(fronta, zprava, strlen(zprava) + 1, 0);
    5.52 -    if (vysledek == 0) {
    5.53 +    if (fronta.odesliZpravu(zprava) == 0) {
    5.54          cout << "Zpráva odeslána." << endl;
    5.55      } else {
    5.56          cout << "Při odesílání zprávy došlo k chybě." << endl;
    5.57      }
    5.58 -
    5.59 -    mq_close(fronta);
    5.60  }
    5.61  
    5.62  void prijimej() {
    5.63      cout << "Přijímáme…" << endl;
    5.64 +    fronta = Fronta(nazevFronty, true, false);
    5.65  
    5.66 -    mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDONLY);
    5.67 -    char s[DELKA_ZPRAVY + 1];
    5.68 -    s[DELKA_ZPRAVY] = '\0';
    5.69 -    if (mq_receive(fronta, s, DELKA_ZPRAVY, NULL) > 0) {
    5.70 -        printf("Přijatá zpráva: %s\n", s);
    5.71 +    char* zprava = fronta.prijmiZpravu();
    5.72 +
    5.73 +    if (zprava == NULL) {
    5.74 +        cout << "Nepodařilo se přijmout zprávu." << endl;
    5.75      } else {
    5.76 -        cout << "Nepodařilo se přijmout zprávu." << endl;
    5.77 +        printf("Přijatá zpráva: %s\n", zprava);
    5.78      }
    5.79 -
    5.80 -    mq_close(fronta);
    5.81  }
    5.82  
    5.83  void zpracujSignal(int signal) {
     6.1 --- a/c++/POSIXoveFronty/Fronta/program.h	Sun Apr 05 22:02:15 2009 +0200
     6.2 +++ b/c++/POSIXoveFronty/Fronta/program.h	Tue Apr 07 01:16:04 2009 +0200
     6.3 @@ -3,7 +3,7 @@
     6.4   * @autor František Kučera <franta-hg@frantovo.cz>
     6.5   */
     6.6  
     6.7 -#include <mqueue.h>
     6.8 +#include "fronta.h"
     6.9  
    6.10  #ifndef _PROGRAM_H
    6.11  #define	_PROGRAM_H
    6.12 @@ -13,22 +13,19 @@
    6.13  extern "C" {
    6.14  #endif
    6.15  
    6.16 -    /** Název POSIXové fronty */
    6.17 -    const char* NAZEV_FRONTY = "/mojeFronta";
    6.18 +    /** Výchozé název POSIXové fronty. */
    6.19 +    const char* VYCHOZI_NAZEV_FRONTY = "/mojeFronta";
    6.20  
    6.21 -    /** Vlastnosti fronty */
    6.22 -    struct mq_attr mq_vlastnosti;
    6.23 +    /** Název POSIXové fronty. */
    6.24 +    char* nazevFronty;
    6.25  
    6.26 -    /** Maximální počet zpráv ve frontě (potom začne blokovat) */
    6.27 -    const int POCET_ZPRAV_VE_FRONTE = 5;
    6.28 +    /** Objekt obalující POSIXovou frontu. */
    6.29 +    Fronta fronta;
    6.30  
    6.31 -    /** Délka jedné zprávy ve frontě */
    6.32 -    const int DELKA_ZPRAVY = 100;
    6.33 -
    6.34 -    /** Režim přijímání zpráv */
    6.35 +    /** Režim přijímání zpráv. */
    6.36      void prijimej();
    6.37  
    6.38 -    /** Režim odesílání zpráv */
    6.39 +    /** Režim odesílání zpráv. */
    6.40      void odesilej();
    6.41  
    6.42      /**