Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ Thread worker and mysql connections

Ostatnio zmodyfikowano 2017-10-17 15:43
Autor Wiadomość
Breakermind
Temat założony przez niniejszego użytkownika
C++ Thread worker z mysql connections
» 2017-10-12 11:56:23
Mysql thread id:
C/C++
unsigned long trID = mysql_thread_id( connect );

Pobieranie danych z różnych tredów:
C/C++
UPDATE messages SET thread_owner =: trID WHERE thread_owner = 0 LIMIT 15

lub blokowanie tabeli
C/C++
LOCK TABLES mytable WRITE;
UPDATE messages SET thread_owner =: trID WHERE thread_owner = 0 LIMIT 15;
UNLOCK TABLES;

Pobieranie z tabeli:
C/C++
SELECT * FROM messages WHERE thread_owner =: trID AND sendtime < NOW();
P-165668
Breakermind
Temat założony przez niniejszego użytkownika
» 2017-10-12 16:42:14
Dlaczego jeżeli mam error inicjalizacja mysql cały program się wykłada zamiast wykonywać pętle w nieskończoność?
Jak temu zapobiec aby przechwycony error ni powodował zamknięcia programu (w pętli while jest klasa która odpala mysql_init()
 po przechwyceniu mysql_error program się zamyka z błędem) mam petle try{}catch etc..?

Takie coś może:
C/C++
#include <signal.h>

extern "C" void handle_aborts( int signal_number )
{
    /*Your code goes here. You can output debugging info.
          If you return from this function, and it was called
          because abort() was called, your program will exit or crash anyway
          (with a dialog box on Windows).
         */
    cout << "Erro " << signal_number << endl;
   
    // sygnał
    // exit(signal_number);
}

/* in main */
signal( SIGABRT, & handle_aborts );
// Signals
// SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM

Lista sygnałów z terminala:
C/C++
kill - l

lub
https://www.tutorialspoint.com/cplusplus/cpp_signal_handling.htm
P-165676
Breakermind
Temat założony przez niniejszego użytkownika
» 2017-10-13 14:52:10
Dlaczego mysql_connect error zamyka moją aplikację pomimo umieszczenia go w try{ }catch({ } i przechwyceniu errora (można to jakoś wyłączyć) cały main mam w pętli:

C/C++
while( 1 ) {
    try {
       
        /* ... tu wszelaki kod z try catch ... tredy ... signals ... itp. */
       
    } catch( std::exception & e ) {
        continue;
    }
}

Jak zablokować zamykanie aplikacji pomimo pojawiających się errorów (Co jest z tym c++ na linuxie)?

C/C++
try {
   
    ....
   
} catch( std::exception & e ) {
    cout << "# ERR: MainErrorException in " << __FILE__;
    cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
    cout << "# ERR: " << e.what() << endl;
    continue;
} catch( const std::runtime_error & re ) {
    // błąd runtime
    std::cerr << "Runtime error: " << re.what() << endl;
} catch( std::bad_alloc & e ) {
    std::cerr << "Allocation error" << endl;
} catch(...) {
    // nieznany błąd
    std::cerr << "Unknown failure occurred. Possible memory corruption" << endl;
}
P-165689
mateczek
» 2017-10-13 15:09:35
wyjątki trzeba obsłużyć czyli pisząc klasę c++ ta klasa musi rzucić wyjątkiem. Try, Cath nie działa z automatu reaguje tylko na błędy które przewidział programista biblioteki.

przykład klasa macierzy ma taki kod
C/C++
matrix matrix::operator *( matrix & m ) {
    if( kolumny != m.wiersze ) throw "nie pomnozysz takich macierzy"; // tylko taki przypadek generuje wyjątek
   
    [...]
    //w main
    matrix m3;
    try {
        m3 = m1 * m2; // tylko jeden wyjątek (kolumny != m.wiersze) jest obsługiwany
        //każdy inny błąd wyście poza tablice normalnie wywali program
    }
    catch( char const * p ) {
        cout << p << endl;
        return 0;
    }

Poniższy przykład normalnie wywali program
C/C++
#include <iostream>
using namespace std;

int main()
{
    int a = 0;
    int b = 5;
    try {
        int c = b / a; // normalny błąd
        cout << c;
    }
    catch( char const * p ) {
        cout << "nie podzielisz";
    }
   
   
}
P-165692
Breakermind
Temat założony przez niniejszego użytkownika
» 2017-10-13 15:43:44
"każdy inny błąd wyście poza tablice normalnie wywali program"

No i czy nie można jakoś zablokować tego wywalania (żeby działała pomimo błędu)?


Trochę o exception:
C/C++
#include <iostream>
#include <exception>

using namespace std;

// Exception struct
struct MyException
    : public exception
{
    const char * what() const throw() {
        return "My exception happened - C++ Exception";
    }
};

// Exception class
class MyException
    : public exception
{
    virtual const char * what() const throw() {
        return "My exception happened";
    }
} MyEx;

int main() {
    try {
        throw MyException();
    } catch( MyException & e ) {
        std::cout << "MyException caught" << std::endl;
        std::cout << e.what() << std::endl;
    } catch( std::exception & e ) {
        //Other errors
    }
}

A jak dodać kilka errorów(exceptions) w jednej klasie?
P-165699
DejaVu
» 2017-10-16 21:01:55
A masz dll-kę obok swojej aplikacji? Bo jak jej nie masz, a linkowałeś dynamicznie to będzie Ci się wykładała aplikacja w momencie wykonania odwołania do czegoś, co nie ma swojej implementacji. No i nie przechwycisz takiego błędu skutecznie.
P-165823
Breakermind
Temat założony przez niniejszego użytkownika
» 2017-10-16 21:18:50
Jeżeli same się nie dodają to ja ich nie podłączam ;).
Kompiluję ze standardowymi bibliotekami z linuxa (instaluje z apt-get  linkuje przez -L -I -lssl itd.) nie tworzę w sumie swoich bibliotek, wszystkie swoje pliki dodaje w trakcie kompilacji z g++ file.cpp file.h itd... chcę w sumie aby tak było, puki co.
(Potencjalny user ma sobie zainstalować potrzebne libs). Może jednak lepszym pomysłem było by dodanie wszystkiego do pliku.

Chcę żeby plik do odpalenia był nie duży i wsie biblioteki czerpał z linuxowego /user/include czy skąd tam on je bierze.
I puki co działa, jutro dopiszę całość to posprawdzam i przetestuję na świeżej instalacji na vps.

A w sumie to jak dorzucić wszystkie potrzebne pliki, biblioteki do pliku który odpalam (żeby wszystko było w jednym pliku, czy kompilator sam je dodaje)?

Kompiluje np:
g++ -o runMe file.cpp file.h klas.cpp klas.h -lssl -lcrypto -std=c++11 -pthread -L/usr/include/mysql -lmysqlclient -I/usr/include/mysql -Wall -Wextra -pedantic -std=c++14 db.h db.cpp sslsmtpex.h sslsmtpex.cpp dnsspf.cpp

Co dodać aby wszelkie biblioteki, pliki dodały się do runME?

Ps. coś mi się chyba przez mysql connector sypało i kilka nieścisłości ;) przepisałem na mysql_query dodałem kilka try{}catch(..){ } i jakoś lepiej i przejrzyściej.


P-165825
Breakermind
Temat założony przez niniejszego użytkownika
» 2017-10-17 09:51:49
Static library:

C/C++
gcc - Wall - c ctest1.c ctest2.c
ar rcs libctest.a ctest1.o ctest2.o
gcc - static cprog.c - L.- lctest - o cprog
./ cprog


Dynamic library:
C/C++
gcc - Wall - fPIC - c ctest1.c ctest2.c
gcc - shared - Wl, - soname, libctest.so.1 - o libctest.so.1.0 ctest1.o ctest2.o
ln - sf libctest.so.1.0 libctest.so
ln - sf libctest.so.1.0 libctest.so.1
gcc - Wall - L.cprog.c - lctest - o cprog
export LD_LIBRARY_PATH =.
./ cprog

C/C++
gcc - Wall - fPIC - c ctest1.c ctest2.c
gcc - shared - Wl, - soname, libctest.so.1 - o libctest.so.1.0 ctest1.o ctest2.o
ln - sf libctest.so.1.0 libctest.so
ln - sf libctest.so.1.0 libctest.so.1
gcc - Wall - o cprog cprog.c - ldl
export LD_LIBRARY_PATH =.
./ cprog

Pliki:
ctest1.c
C/C++
void ctest1( int * i ) {
    * i = 100;
}

ctest2.c
C/C++
void ctest2( int * i ) {
    * i = 5;
}

cprog.c
C/C++
#include <stdio.h>
void ctest1( int * );
void ctest2( int * );

int main() {
    int x;
    int y;
    int z;
    ctest1( & x );
    ctest2( & y );
    z =( x / y );
    printf( "%d / %d = %d\n", x, y, z );
    return 0;
}

Link: http://www.techytalk.info/c-cplusplus-library-programming-on-linux-part-one-static-libraries/
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
P-165833
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona