Bonjour,
C'est ma première journée sur le TThreads
Je galère un peu, alors voici mes questions
Je créé un thread de calcul "non suspendu" sur l'appui d'un bouton
Dans le Execute()
je "prépare" 3 autres threads suspendus eux par contre pour une série d'opérations sur des grands entiers (la multiplication récursive de Karatsuba)
voici une portion de ce Execute()
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 bool __fastcall TLLTestsThread::TestExponentMersenne(jpNexp exponent_p) { ... kthr[VPS] = new TKaratsubaThread(kthrs_digits[VPS], g1, a, b, L"_VPS"); kthr[VG] = new TKaratsubaThread(kthrs_digits[VG], g_sn_digits, c, d, L"_VG"); kthr[VD] = new TKaratsubaThread(kthrs_digits[VD], g_sn_digits + g, e, f, L"_VD"); ... for (it=1; it<(exponent_p-2); it++) { thr_square_karatsuba(g_sn2_digits, g_sn_digits, g_sn2_digits_nb, g_sn_digits_nb, kthr); jpn2_sub(g_sn2m2_digits, g_sn2_digits, g_2.digits, g_sn2m2_digits_nb, g_sn2_digits_nb, 1); jpn2_div_for_ll(g_sn_digits, g_sn_d2n_digits, g_sn_m2n_digits, g_sn2m2_digits, g_mersenne_digits, g_mersenne_digits_nb, exponent_p); }
dans ma fonction thr_square_karatsuba()
j'appelle mes 3 threads avec Start()
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 kthr[VG]->Start(); kthr[VG]->WaitFor(); kthr[VD]->Start(); kthr[VD]->WaitFor(); kthr[VPS]->Start(); kthr[VPS]->WaitFor()
Le soucis c'est que lors de la 1er iteration (it=1), les threads sont bien lancés
puisque qu'ils démarrent a partir d'un mode (Suspended=true, Finished=false)
lors du deuxième tour de boucle (it=2)
les 3 threads sont apparemment dans un mode (Suspended=false, Finished=true)
qui ne permet pas les 3 nouveaux appels de Start(), le 1er plante !
et cela me produit une exception EThread
Pourquoi ?
les threads ne sont pas suspendus !?
Merci pour votre aide
PS:
- je précise que j'ai géré les Terminated, même si je ne le mentionne pas
- l'ordre
a été mis en place pour un débogage plus aisé, ensuite je ferais tout mes Start() à la suite puis tout mes WaitFor()
Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part Thread1->Start(),Thread1-> WaitFor(), Thread2->Start(),Thread2-> WaitFor(), Thread3->Start(),Thread3-> WaitFor()
Partager