Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 3 của 3
  1. #1

    Vector , _beginthreadex Lỗi Unhandled exception khó hiểu ?

    Mình có demo thử cách dùng vector trong việc xử lý mảng ký tự ( TCHAR*)
    nhưng có 1 lỗi rất kỳ lạ là Nếu chạy chương trình này 1 lần ( không cho hàm

    unsigned __stdcall ThreadString(void* pArguments)
    chạy trong vòng lặp While ) thì không có lỗi gì cả,nhưng nếu đặt nó vào vòng lặp while như bên dưới thì lập tức biến std::vector<TCHAR*>veLine; bị <Bad Ptr>

    đây là đoạn code lỗi( nếu có vòng lặp while
    Mã:
    #include <Windows.h>
    #include <vector>
    #include <tchar.h>
    #include <stdio.h>
    #include <process.h>
    std::vector<TCHAR*>veLine;
    #define MAX_FOLDER_PATH 1024 
    unsigned __stdcall ThreadString(void* pArguments){
    	int i;
    	TCHAR szPathFolder[MAX_FOLDER_PATH];
    	lstrcpy(szPathFolder,_T("C:\\Users\\vcs\\Desktop"));
    	TCHAR szGetLine[MAX_FOLDER_PATH];
    	lstrcpy(szGetLine,_T("string 1"));
    	veLine.push_back(szGetLine);
    	lstrcpy(szGetLine,_T("string 2"));
    	veLine.push_back(szGetLine);
    	lstrcpy(szGetLine,_T("string 3"));
    	veLine.push_back(szGetLine);
    	int iSize = veLine.size();
    	int iReturn;
    	for ( i =0 ; i< iSize ; i++ ){
    		iReturn = lstrcmp(veLine[i],szPathFolder);
    		int ileng = lstrlen(szPathFolder);
    		int iVleng = lstrlen(veLine[i]);
    		if (iReturn == 0){
    			break;	
    		}
    	}
    	_endthreadex( 0 );
    	return 0;
    }
    int main()
    {
    	unsigned threadID;
    	while(true){
    		_beginthreadex(NULL,0,&ThreadString, 0, 0, &threadID);
    		Sleep(1000);
    	}
    	return 0;
    }
    lỗi sinh ra sau khi chạy được vài giây





    đây là đoạn chương trình chạy không có vòng lặp while ( thì chương trình không lỗi )


    Mã:
    #include <Windows.h>
    #include <vector>
    #include <tchar.h>
    #include <stdio.h>
    #include <process.h>
    std::vector<TCHAR*>veLine;
    #define MAX_FOLDER_PATH 1024 
    unsigned __stdcall ThreadString(void* pArguments){
    	int i;
    	TCHAR szPathFolder[MAX_FOLDER_PATH];
    	lstrcpy(szPathFolder,_T("C:\\Users\\vcs\\Desktop"));
    	TCHAR szGetLine[MAX_FOLDER_PATH];
    	lstrcpy(szGetLine,_T("string 1"));
    	veLine.push_back(szGetLine);
    	lstrcpy(szGetLine,_T("string 2"));
    	veLine.push_back(szGetLine);
    	lstrcpy(szGetLine,_T("string 3"));
    	veLine.push_back(szGetLine);
    	int iSize = veLine.size();
    	int iReturn;
    	for ( i =0 ; i< iSize ; i++ ){
    		iReturn = lstrcmp(veLine[i],szPathFolder);
    		int ileng = lstrlen(szPathFolder);
    		int iVleng = lstrlen(veLine[i]);
    		if (iReturn == 0){
    			break;	
    		}
    	}
    	_endthreadex( 0 );
    	return 0;
    }
    int main()
    {
    	unsigned threadID;
    	/*while(true){*/
    		_beginthreadex(NULL,0,&ThreadString, 0, 0, &threadID);
    	//Sleep(1000);
    	//}
    	return 0;
    }
    ai có thể giải thích và sửa giúp mình lỗi ở trên không: đây là code lỗi

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình biết lỗi là do con trỏ TCHAR* rồi ( khai báo ở đây std::vector<TCHAR*>veLine; )
    nhưng chỉ gặp lỗi nếu mình để nó trong Thread --> khá lạ ,còn nếu bỏ thread đi mà vẫn để vòng for kiểu như thế này thì không lỗi
    Mã:
    int main()
    {
    	while(true){
    	    ThreadString();
    	    Sleep(1000);
    	}
    	return 0;
    }

  3. #3
    Ngày tham gia
    Sep 2015
    Đang ở
    hà nội
    Bài viết
    0
    Thứ nhất trong chương trình của bạn có mấy điểm lưu ý như sau:

    1.vector<TCHAR*>veLine; Là biến toàn cục vector chứa địa chỉ của con trỏ trỏ tới một xâu kiểu TCHAR. Nhưng các xâu TCHAR này lại là biến cục bộ do bạn khởi tạo cho nên khi bạn chạy xong 1 Thread trong vòng while các biến cục bộ này bị hủy đồng nghĩa với việc địa chỉ và trong vector[i] dẫn tới là không hợp lệ.
    Trong khi vector.size() vẫn cứ tăng lên khi bạn chạy Thread thứ 2.

    2.Như vậy, đến lượt Thread thứ 2 khi nó duyệt từ 0 đến veLine.size() thì địa chỉ truy xuất veLine[i] là không hợp lệ gây ra lỗi trên.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •