An die C/C++ wissenden.
Übersicht

![]() |
kogBetreff: An die C/C++ wissenden. |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Logik ist mir gar nicht in den Sinn gekommen ![]() Habe die Variabel nun vor der Funktion definiert, jetzt wird zwar ein wert übergeben, doch der sieht so aus: ?C(und nochn sonderzeichen) |
||
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm ich hoffe du schreibst in ICQ zurück, dann könnten wir da alles bereden. | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group