An die C/C++ wissenden.

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

kog

Betreff: An die C/C++ wissenden.

BeitragDi, Mai 20, 2008 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag,
ich experimentiere einbisschen mit C/C++ herum, unteranderem wegen Multithreading.
Ich will aus Bmax heraus einen Thread erstellen, für dies nutze ich jedoch dann eine .cpp Datei, damit diese den Thread verwaltet.
Dies ist mein bisheriger Code (vieles nur testweise):
Code: [AUSKLAPPEN]
#define WIN32_LEAN_AND_MEAN  // Kein MFC Zeugs *arg*

#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <cstdio>

#include "lua-5.1/src/lua.h"
#include "lua-5.1/src/lualib.h"
#include "lua-5.1/src/lauxlib.h"

struct plugin_info {
   const char *script;
   lua_State *state;
};

extern "C" {
   HANDLE CreatePluginThread(lua_State *L,const char* script,int* index,DWORD *dwThreadID);
   DWORD WINAPI ThreadFunc(LPVOID data);
   
   HANDLE CreatePluginThread(lua_State *L,const char* script,int* index,DWORD *dwThreadID)  {
      HANDLE h;

      plugin_info info;
      info.script=script;
      info.state=L;

      h=CreateThread(NULL,0,ThreadFunc,(LPVOID)&info,CREATE_SUSPENDED,dwThreadID);
      return h;
   }


}
DWORD WINAPI ThreadFunc(LPVOID data) {
   plugin_info * info=(plugin_info*)data;
   printf("%s\n\r\n\r",info->script);fflush(stdout);

   return((DWORD)data);

   //luaL_loadbuffer(info->state, info->script, strlen(info->script), info->script);
   while(true)  {
      //lua_pcall(info->state, 0, 0, 0);

      Sleep(200);
   }
   return((DWORD)data);
}


Ich übergebe ein LUA script an die Create Funktion und dies soll es in einer Struct speichern, alles gut und toll, macht es auch. Doch das weitergeben als Parameter klappt nicht.
Bei der ThreadFunc wird bei printf() nur (null) ausgegeben.

Ich verzweifle schon seit sicher 2 Stunden.
Ich hoffe ihr könnt mir helfen.
 

ChristianK

BeitragDi, Mai 20, 2008 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke, es liegt daran, dass du CreateThread die Struktur "info" übergibst. Weil sie nur auf dem Stack erstellt wird, wird sie wieder gelöscht, nachdem die Funktion beendet wird. Deshalb ist sie nicht mehr da, wenn der Thread aufgerufen wird. Du musst also die Struktur auf dem Heap erstellen. Wichtig: Du darfs den Speicher nicht in BlitzMax reservieren, z.B. mit einer Bank. Ansonsten könnte der Garbage Collector ihn freigeben und du stehst wieder vor dem gleichen Problem.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

kog

BeitragDi, Mai 20, 2008 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Logik ist mir gar nicht in den Sinn gekommen Very Happy
Habe die Variabel nun vor der Funktion definiert, jetzt wird zwar ein wert übergeben, doch der sieht so aus:
?C(und nochn sonderzeichen)
 

ChristianK

BeitragDi, Mai 20, 2008 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin mir nicht sicher, ob das die Fehlerquelle ist, aber bei dem String "script" besteht das gleiche Problem. Es ist nur ein Zeiger auf einen String, der von BlitzMax kontrolliert wird. Du solltest ihn besser in einen eigenen Buffer kopieren. Kannst du eventuell auch mal deinen BlitzMax-Code zeigen?
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

kog

BeitragDi, Mai 20, 2008 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm ich hoffe du schreibst in ICQ zurück, dann könnten wir da alles bereden.
 

Dreamora

BeitragDi, Mai 20, 2008 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Daten die man in BM alloziert und die in C++ genutzt werden sollen, speziell asyncron, müssen entweder in einem memalloc buffer stehen oder von string.tocstring() / .towstring() stehen.

Diese BytePtr zeigen auf normale unmanaged memory blocks und müssen entsprechend nach der verwendung mit memfree gelöscht werden, da der GC sie ignoriert.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group