Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Hủy Thread khi đang copy file trong thread?

  1. #1
    Ngày gia nhập
    09 2009
    Bài viết
    20

    Post Hủy Thread khi đang copy file trong thread?

    Mình mới học lập trình WinApi, đang làm 1 bài tập về copy file sử dụng Thread. Mình tạo 1 thread cho copy file, và khi đang copy mình cancel copy file bằng cách hủy thread. Mình muốn xóa file đang copy chưa xong nhưng không được, phải tắt chương trình mới xóa được file. Anh em nào rành phần này giúp dùm mình với, mình gửi code mọi người giúp đỡ nha. Thanks nhiều!!!

    Visual C++ Code:
    1. #include <Windows.h>
    2.  
    3. LPCWSTR pFROM;
    4. LPCWSTR pTO;
    5. HWND hwndButton1;
    6. HANDLE Thread;
    7.  
    8. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    9. DWORD WINAPI Copy(LPVOID);
    10.  
    11.  
    12. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
    13.             LPSTR lpCmdLine, int nCmdShow )
    14. {
    15.   MSG  msg ;    
    16.   WNDCLASS wc = {0};
    17.  
    18.   //Step 1: Registering the Window Class
    19.   wc.lpszClassName = TEXT( "Copy Data" );
    20.   wc.hInstance     = hInstance ;
    21.   wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
    22.   wc.lpfnWndProc   = WndProc ;
    23.   wc.hCursor       = LoadCursor(0,IDC_ARROW);
    24.  
    25.   RegisterClass(&wc);
    26.  
    27.   // Step 2: Creating the Window
    28.   CreateWindow( wc.lpszClassName, TEXT("Copy Data"),
    29.                 WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_MAXIMIZEBOX,
    30.                 100, 100, 330, 170, 0, 0, hInstance, 0);  
    31.  
    32.   // Step 3: The Message Loop
    33.   while( GetMessage(&msg, NULL, 0, 0)) {
    34.     TranslateMessage(&msg);
    35.     DispatchMessage(&msg);
    36.   }
    37.   return (int) msg.wParam;
    38. }
    39.  
    40. // Step 4: the Window Procedure
    41. LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
    42. {
    43.     static HWND hwndLabel1;
    44.     static HWND hwndLabel2;
    45.  
    46.     static HWND hwndEdit1;
    47.     static HWND hwndEdit2;
    48.  
    49.    
    50.     static HWND hwndButton2;   
    51.  
    52.     static int len;
    53.     static TCHAR text[30];
    54.    
    55.     switch(msg)  
    56.     {
    57.         case WM_CREATE:
    58.         {
    59.             hwndLabel1 = CreateWindow(TEXT("STATIC"), TEXT("From:"),
    60.                 WS_CHILD | WS_VISIBLE | SS_LEFT,
    61.                 20, 20, 300, 230,
    62.                 hwnd, (HMENU) 0, NULL, NULL);
    63.  
    64.             hwndLabel2 = CreateWindow(TEXT("STATIC"), TEXT("To:"),
    65.                 WS_CHILD | WS_VISIBLE | SS_LEFT,
    66.                 20, 50, 300, 230,
    67.                 hwnd, (HMENU) 0, NULL, NULL);
    68.  
    69.             hwndEdit1 = CreateWindow(TEXT("EDIT"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,
    70.                 70, 20, 180, 20, hwnd, (HMENU) 1,
    71.                 NULL, NULL);
    72.  
    73.             hwndEdit2 = CreateWindow(TEXT("EDIT"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,
    74.                 70, 50, 180, 20, hwnd, (HMENU) 2,
    75.                 NULL, NULL);
    76.  
    77.             hwndButton1 = CreateWindow(TEXT("BUTTON"), TEXT("Copy"),      
    78.                 WS_VISIBLE | WS_CHILD,  
    79.                 70, 80, 80, 25,        
    80.                 hwnd, (HMENU) 3, NULL, NULL);  
    81.  
    82.             hwndButton2 = CreateWindow(TEXT("BUTTON"), TEXT("Cancel"),      
    83.                 WS_VISIBLE | WS_CHILD,  
    84.                 170, 80, 80, 25,        
    85.                 hwnd, (HMENU) 4, NULL, NULL);
    86.            
    87.             break;
    88.         }
    89.         case WM_COMMAND:
    90.         {
    91.             if (LOWORD(wParam) == 3) {                         
    92.                 SetWindowText(hwndButton1, L"Copying...");     
    93.                        
    94.                 static TCHAR pFrom[30], pTo[30];
    95.                 GetWindowText(hwndEdit1, pFrom, GetWindowTextLength(hwndEdit1) + 1);
    96.                 GetWindowText(hwndEdit2, pTo, GetWindowTextLength(hwndEdit2) + 1);
    97.                 pFROM = (LPCWSTR)pFrom;
    98.                 pTO = (LPCWSTR)pTo;
    99.  
    100.                 Thread = CreateThread(NULL, 0, Copy, NULL, 0, 0);  
    101.  
    102.             }
    103.             if (LOWORD(wParam) == 4) {
    104.                 if(Thread != NULL){
    105.                     TerminateThread(Thread, 0);
    106.                     CloseHandle(Thread);
    107.                     SetWindowText(hwndButton1, L"Copy");
    108.                 }
    109.             }
    110.             break;
    111.         }
    112.         case WM_DESTROY:
    113.         {
    114.             PostQuitMessage(0);
    115.             break;
    116.         }
    117.     }
    118.     return DefWindowProc(hwnd, msg, wParam, lParam);
    119. }
    120.  
    121.  
    122. DWORD WINAPI Copy( LPVOID lpData )
    123. {
    124.     CopyFile(pFROM, pTO, TRUE); //arg1: source file, arg2: dest file, arg3: check file exist
    125.     SetWindowText(hwndButton1, L"Copy");   
    126.     return 0;
    127. }

    Mong ae giúp đỡ
    Attached Files Attached Files

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Sử dụng CopyFileEx, với tham số thứ 5 là TRUE. CopyFileEx cho phép bạn handle cả quá trình copy. Hãy tìm đọc MSDN để hiểu rõ hơn!

    Có lẽ nó sẽ như thế này: CopyFileEx(pFROM, pTO, NULL, NULL, TRUE, COPY_FILE_FAIL_IF_EXISTS);
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    Ngày gia nhập
    09 2009
    Bài viết
    20

    Trích dẫn Nguyên bản được gửi bởi Kevin Hoang Xem bài viết
    Sử dụng CopyFileEx, với tham số thứ 5 là TRUE. CopyFileEx cho phép bạn handle cả quá trình copy. Hãy tìm đọc MSDN để hiểu rõ hơn!

    Có lẽ nó sẽ như thế này: CopyFileEx(pFROM, pTO, NULL, NULL, TRUE, COPY_FILE_FAIL_IF_EXISTS);
    Mình đã sử dụng theo cách của bạn, nhưng khi để TRUE thì nó không thực hiện copy file mà chỉ khi để FALSE nó mới thực hiện, với lại nó cũng chưa cancel được thread. Code mình viết lại chỗ copy file như vậy nè, không biết có đúng ko:
    Code:
    	BOOL bCancel = TRUE;
    	CopyFileEx(pFROM, pTO, NULL, NULL, &bCancel, COPY_FILE_FAIL_IF_EXISTS);

  4. #4
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Kevin có chút nhầm lẫn, nếu bạn thiết lập tham số đó là true ngay từ đầu thì rõ ràng là nó cancel ngay! Bạn cần phải xây dựng hàm callback CopyProgressRoutine để xử lý việc cancel copy file theo ý muốn!

    Ref Link Code:

    Vì là hàm callback, bạn return PROGRESS_CANCEL vào thời điểm nào thì thời điểm đó CopyFile sẽ ngừng, ngược lại thì return PROGRESS_CONTINUE để tiếp tục copy! Đơn giản là như vậy!

    Một cách khác là bạn sử dụng OpenFile, WriteFile để copy bằng tạo destination file mới!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  5. #5
    Ngày gia nhập
    09 2009
    Bài viết
    20

    mình mới học về thread nên chưa hình dung callback như thế nào, bro kevin có thế hướng dẫn mình tạo như thế nào ko, tìm trên mạng mà thấy tùm lum không rõ ràng cho lắm

  6. #6
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Mặc định Hủy Thread khi đang copy file trong thread?

    Trích dẫn Nguyên bản được gửi bởi khabin Xem bài viết
    mình mới học về thread nên chưa hình dung callback như thế nào, bro kevin có thế hướng dẫn mình tạo như thế nào ko, tìm trên mạng mà thấy tùm lum không rõ ràng cho lắm
    callback tức là 1 hàm bình thường nhưng có prototype được xác định trước để API của HDH gọi trong quá trình chạy.



    http://en.wikipedia.org/wiki/Callbac...programming%29

  7. #7
    Ngày gia nhập
    02 2009
    Bài viết
    23

    Bạn nên dùng cách mở file, sau đó tạo file mới, như vậy bạn sẽ dừng copy một cách chuẩn nhất. Bình thường chỉ Kill thread thì sẽ gây memory leak.

Các đề tài tương tự

  1. Sự khác nhau giữa thread 6 và thread 7 trong Java?
    Gửi bởi nt.huy91 trong diễn đàn Thắc mắc lập trình Java
    Trả lời: 5
    Bài viết cuối: 26-10-2012, 01:32 PM
  2. Trả lời: 0
    Bài viết cuối: 16-02-2012, 10:37 PM
  3. Giới thiệu thread và multi thread trong lập trình C#
    Gửi bởi dieucay555 trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 26-07-2011, 06:16 PM
  4. Socket vẫn bị lỗi khi dùng Thread? không thể gán giá trị vào textbox trong Thread ^^!
    Gửi bởi lion080889 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 16-07-2011, 06:35 PM
  5. Thread trong Dialog và Thread trog Tabcontrol ???
    Gửi bởi nam_dkn trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 20-03-2009, 10:43 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn