OK... alors j'ai peut-être une idée, mais j'y crois pas trop :?
Chaque thread maintient un cache des champs qu'il manipule (pour des raisons d'optimisation), si bien qu'une modification par un thread de la valeur d'un champ n'est pas forcément visible tout de suite dans les autres threads. Je ne connais pas le mécanisme exact, mais en C# il existe le modifieur volatile pour éviter qu'un champ soit mis en cache. Je ne connais pas l'équivalent en Visual Basic, mais s'il existe, tu peux essayer de l'appliquer au champ g_bln_cancel.