2010-01-01 19 views
2

Je suis en train d'obtenir ce programme simple pour travailler sur les fenêtres, mais il se bloque:Essayer d'utiliser les threads tcl sur windows 7 résultats en violation d'accès

 
unsigned (__stdcall testfoo)(ClientData x) 
{ 
    return 0; 
} 

int main() 
{ 
    Tcl_ThreadId testid = 0; 
    Tcl_CreateThread(&testid, testfoo, (ClientData) NULL, TCL_THREAD_STACK_DEFAULT, TCL_THREAD_NOFLAGS); 
} 

J'utilise un makefile généré par cmake et la liaison par rapport à une version de Tcl 8.5.7 Je me suis compilé en utilisant Visual C++ 2008 express. Il a été compilé en utilisant msvcrt, static, threads et le nom de la bibliothèque résultante est tcl85tsx.lib. L'erreur est:

 
Unhandled exception at 0x77448c39 in main.exe: 0xC0000005: Access violation writing location 0x00000014. 

La bibliothèque Tcl fonctionne très bien, et je peux même exécuter un exemple de script de filetage en chargeant l'extension de fil en elle. Mon hypothèse est qu'il y a quelque chose d'horriblement mal avec une violation de mémoire, mais je n'ai aucune idée de quoi. Toute aide appréciée.

+0

Je suggère: Essayez de démarrer l'application à partir de Windbg Et regardez la pile; – whunmr

+0

Avez-vous testé le même code sur une autre plateforme (ou même sur une version différente de Windows)? – bta

Répondre

2

TclInitSubsystems est appelée lorsque vous appelez Tcl_FindExecutable(), est public. Si vous n'avez pas le nom de l'exécutable à portée de main, passez simplement NULL à cet endroit.

+0

Très intéressant. Merci. – Juan

1

J'ai fini par compiler une version débogeable de Tcl. Le problème est que vous devez appeler TclInitSubsystems pour initialiser tous les verrous requis pour la création de threads. Malheureusement, ceci n'est pas publiquement accessible, et un intepreter doit être créé avec Tcl_CreateInterp. C'était un programme de test pour une application que je développais et qui avait un interpréteur Tcl, donc ce ne sera pas un problème en production. J'ai juste besoin de créer un interprète pour ce programme de test simple.