Probleme d'affichage [Résolu]

Signaler
Messages postés
27
Date d'inscription
samedi 9 octobre 2004
Statut
Membre
Dernière intervention
2 septembre 2005
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Salut tout le monde;
j'ai une question a la quelle j'ai pas pu trouver de reponse, ben , pour quoi si on lanse un long traitement sur VC6 (par exemple avec un click sur un button) tous les autres controles se bloquent, et pire que cela le dialog deviens illisible, je veux pas etuliser les threades mais si qlq1 a une solution pour rendre la fenetre lisible meme s'elle est inactive.

Mercie pour tous.

6 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Je mets dans WinMain() pour initialiser COM en multithread sinon tu mets CoInitialize(NULL) au début du thread.

Ce que fait le thread peu importe, j'ai juste mis le début pour montrer comment initialiser les pointeurs ADO, ensuite tout s'emploie normalement comme dans mes exemples ADO en source sur cppfrance.

ciao...
BruNews, MVP VC++
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
3
???, moi sa ne mais jamais arriver ce problème, montre nius ton code
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Un long traitement se met dans un thread séparé.

ciao...
BruNews, MVP VC++
Messages postés
27
Date d'inscription
samedi 9 octobre 2004
Statut
Membre
Dernière intervention
2 septembre 2005

oui c'est vrais c'est un trés long traitement mais le probleme avec les threads c'est que j'arrive pas a me connecter a une BD dans le thread ni avec ADO ni DAO (ODBC jamais essayé)

Merci pour tous
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
J'avais déjà répondu à cela il y a peu.

dans WinMain:
if(S_OK != CoInitializeEx(NULL, COINIT_MULTITHREADED)) return 0;

dans bouton, exemple issu de mon taf:
hthread = CreateThread(0, 0, MdbStructThread,...);

DWORD WINAPI MdbStructThread(PVOID pvPrm)
{
ExtractStructDB((LPANALYDATA)pvPrm);
PostMessage(((LPANALYDATA) pvPrm)->hDlg, WM_ANALYSEND, 0, 0);
return 0;
}
void ExtractStructDB(LPANALYDATA pData)
{
DWORD dwWrite;
_ConnectionPtr pConnDB = NULL;
_RecordsetPtr pRs, pSchemaRs;
FieldPtr pFld;
long i, nFlds, lType, bRet = 1;
_bstr_t bst("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");
_variant_t varIdx;
bst += pData->szMdb;
if(pData->szPsswrd[0]) {bst += ";Jet OLEDB:Database Password="; bst += pData->szPsswrd;}
try {
TESTHR(pConnDB.CreateInstance(__uuidof(Connection)));
TESTHR(pRs.CreateInstance(__uuidof(Recordset)));
pConnDB->Mode = adModeShareExclusive;
pConnDB->Open(bst, "", "", NULL);
}
catch(_com_error &e) {MsgAdoError(pData->hDlg, e); return;}

ETC......
}

et voilà ADO en thread et va impec.

ciao...
BruNews, MVP VC++
Messages postés
27
Date d'inscription
samedi 9 octobre 2004
Statut
Membre
Dernière intervention
2 septembre 2005

est ce que tu peux m'expliquer ton thread fait quoi et pour quoi la condition if dans winmain qui return 0.
Merci.