olen nyt luomassa palvelinta, joka kuuntelee clientien viestejä omassa säikeissään ja suorittaa omia toimintojaan pääsäikeessä. Kirjastona käytän SFML:ää ja törmäsin ongelmaan säieluokkaa tehdessäni, eli luulen tehneeni kaiken oikein, mutta siltikään se ei vain toimi. Tällä hetkellä koodini näyttää pelkistettynä seuraavalta:
main.cpp
#include <iostream> #include <string> #include "include/Yhteys.h" int main() { Yhteys yhteys(); yhteys.Kaynnista(); return 0; }
Yhteysluokka:
#ifndef YHTEYS_H #define YHTEYS_H #include <SFML/System.hpp> #include <SFML/Network.hpp> #include <iostream> #include <string> /** * Säieluokka, joka hoitaa palvelimen yhteydet clientien välillä. */ class Yhteys : private sf::Thread { public: // Käynnistää säikeen void Kaynnista(); protected: private: // Säikeen toiminnot tämän sisälle virtual void Run(); }; #endif // YHTEYS_H
#include "../include/Yhteys.h" void Yhteys::Kaynnista() { Launch(); } void Yhteys::Run() { ; }
Minä en ainakaan tuosta sinun koodistasi vikaa huomannut. Mikä siinä on ongelmana. Mitä sinulla on tuossa Run metodin sisällä (siis säikeen koodina), ehkä vika piilee siinä.
Koodissasi on ylimääräiset sulut yhteys-olion määrittelyssä; nyt rivillä itse asiassa esitellään funktio. Tämä lienee kuitenkin alkuperäisessä versiossa oikein, eihän se muuten edes kääntyisi.
Ongelma on varmaankin siinä, että main-funktio loppuu saman tien, jolloin säieolio tuhotaan ja säikeen suoritus loppuu väkipakolla. Sinun täytyy lisätä main-funktioon rivi yhteys.Wait(), joka odottaa säikeen suorituksen loppuun asti.
Kiitoksia Metabolix sain ongelman ratkaistua ja nyt säikeeni toimii aivan oikein.
Aihe on jo aika vanha, joten et voi enää vastata siihen.