Aktuelle Zeit: 22.12.2024, 20:03

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 06.02.2008, 10:56 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Hallo,

ich habs jetzt endlich mal wieder geschafft, ein bisschen was zu machen. Ich hab jetzt SDL mit Irrlicht kombiniert, der Teil sieht auch gut aus (denke ich). Ich möchte mit SDL einen eigenen Thread machen, in dem später die Physik mit ODE laufen soll, in dem Thread würde ich auch die Abfragen von Tastatur und Maus und so machen. In meinem ersten Irrlicht SDL Testprogramm hab ich zwei Threads gemacht, einer läuft einfach und einer wartet auf Events. Dieser zweite Thread kriegt aber keine Events mit (bzw. nur sehr wenige, auf jedenfall keine Keyboard Events). Ich hab den Code unten mal angehängt, vielleicht hat von euch jemand eine Idee, was das Problem sein könnte. Danke schon mal,

Brainsaw

Code:
#include <windows.h>

#ifdef __cplusplus
    #include <cstdlib>
#else
    #include <stdlib.h>
#endif

#include <SDL/SDL_getenv.h>
#include <SDL/SDL.h>
#include <SDL/SDL_syswm.h>
#include <irrlicht.h>

bool g_bThreadRunning=true;

int keyboardThread(void *nothing)
{
SDL_Event event;

  SDL_EnableKeyRepeat(0,0);
  SDL_EnableUNICODE(1);

  printf("kbThread...\n");
  while (g_bThreadRunning)
  {
    if (SDL_WaitEvent(&event))
    {
      printf("\tEvent ... %i\n",event.type);
      switch (event.type)
      {
        case SDL_QUIT: g_bThreadRunning=false; break;
        case SDL_KEYDOWN: { printf("\t\tkeyDown\n"); if (event.key.keysym.sym == SDLK_ESCAPE) g_bThreadRunning=false; break; }
      }
    }
  }
  printf("kbThread end\n");

  return 0;
}

int threadFunktion(void *nichtVerwendet)
{
int found,i;

  printf("Thread\n");

  while (g_bThreadRunning) { printf("--> Thread\n"); SDL_Delay(100); }
  printf("Thread end.\n");
  return 0;
}

int main ( int argc, char** argv )
{
SDL_Thread *thread,*kbThread;
int i;
HWND sdl_hWnd;

  if (SDL_Init(SDL_INIT_EVERYTHING)<0) { printf( "Unable to init SDL: %s\n", SDL_GetError() ); return 1; }
  SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,SDL_HWSURFACE|SDL_DOUBLEBUF);

  static SDL_SysWMinfo pInfo;
  SDL_VERSION(&pInfo.version);
  SDL_GetWMInfo(&pInfo);
  sdl_hWnd = pInfo.window;

  irr::SIrrlichtCreationParameters   params;
  params.AntiAlias=false;
  params.Bits=16;
  params.DriverType=irr::video::EDT_OPENGL;
  params.Fullscreen=false;
  params.Stencilbuffer=false;
  params.Vsync=false;
  params.WindowSize=irr::core::dimension2d<irr::s32>(640,480);
  params.WindowId = (void *)sdl_hWnd;

  irr::IrrlichtDevice *device = createDeviceEx(params);

  irr::video::IVideoDriver* driver = device->getVideoDriver();
  irr::scene::ISceneManager* smgr = device->getSceneManager();

  atexit(SDL_Quit);

  if (!screen) { printf("Unable to set 640x480 video: %s\n", SDL_GetError()); return 1; }

  thread = SDL_CreateThread(threadFunktion, NULL);
  kbThread=SDL_CreateThread(keyboardThread, NULL);

  if (thread==NULL) { fprintf(stderr, "Unable to start thread: %s\n", SDL_GetError()); return 1; }
  if (kbThread==NULL) { fprintf(stderr,"Unable to start keyboard therd: %s\n",SDL_GetError()); return 1; }

  while (g_bThreadRunning) { printf("."); driver->beginScene(true, true, irr::video::SColor(255,0,20,40)); smgr->drawAll(); driver->endScene(); }


  SDL_WaitThread(thread  ,NULL);
  SDL_WaitThread(kbThread,NULL);

  printf("Exited cleanly\n");
  return 0;
}


_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 06.02.2008, 11:41 
Offline

Registriert: 03.02.2008, 19:47
Beiträge: 13
Hmm,

ersetz mal
SDL_WaitEvent(&event)

durch
SDL_PollEvent(&event)

glaube zwar kaum das es dann geht, aber ich hatte damit nie Probleme.

_________________
Heute code ich, morgen debug ich und übermorgen caste ich die Königin auf int!


Nach oben
 Profil  
 
BeitragVerfasst: 06.02.2008, 12:05 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Das hatte ich schon ... hab alle Möglichkeiten durchprobiert (wait, poll, peek), funktioniert aber nicht.

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 06.02.2008, 12:15 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Mein WinAPI Zeiten sind schon etwas her und ich weiß auch nicht wie SDL intern die events verarbeitet, aber ich meine mich erinnern zu können, dass die Window Messages nur an den Thread geschickt werden, der das Fenster erstellt hat.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 06.02.2008, 14:12 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
Hmm .. ich hab am Netz ein Beispiel gefunden, bei dem Maus- und Keyboardevents in eigenen Threads abgearbeitet werden ... vielleicht sollte ich Das mal kompilieren und Testen ...

_________________
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 11.02.2008, 08:22 
Offline
Benutzeravatar

Registriert: 16.10.2007, 07:56
Beiträge: 229
Wohnort: Regensburg
OK, ich hab mir jetzt mal noch ein paar Gedanken drüber gemacht: eigentlich gefällt mir die Art, mit der Irrlicht auf Keyboardinput reagiert ziemlich gut, ich werd als nächstes mal einen Test machen, bei dem ich Irrlicht für Keyboard und Maus benutze und SDL in erster Linie für die Threads und für Joystick Input. Ich hoffe, ich komme bald dazu, hab richtig Freizeitstreß zur Zeit.

_________________
Bild


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de