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

Đề tài: Cần hiểu về vấn đề delay 1 hàm

  1. #1
    Ngày gia nhập
    04 2008
    Bài viết
    6

    Mặc định Cần hiểu về vấn đề delay 1 hàm

    Chào các bạn !. Mình gặp 1 vấn đề như thế này: Có 1 Process đang chạy và cứ sau 1 s thì nó update dữ liệu 1 lần (giống nhu game đấy). Mình đã hook vào process , load file hook.dll vào rồi unhook luôn, nghĩa là mình đã ở trong hàm winproc rồi. Trong winproc mình bắt và xử lí 1 event. Trong hàm xử lí event mình có 2 hàm, tạm gọi là func1 và func2. Vì hàm func2 cần dữ liệu của func1 sau khi process update nên nếu thực hiện func2 ngay sau func1 thì trong 1s nó thực hiện cả 2 hàm,làm cho hàm func2 chưa kịp nhận dũ liệu update của process sau khi thực hiện func1. Vấn đề mình đặt ra là: Có cách nào delay lại khoảng thời gian 1s sau khi thực hiẹn func1,để cho process update dũ liệu cho func2 xử lí nhưng không làm delay cả process không?
    Mình viết tren VC++.Net .Bạn nào biết trong MSDN có phần nào liên quan đến vấn đề này, hay biết cách giải quyết xin chỉ cho minh.

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Lúc bạn chuyển dữ liệu từ Func1 thì bạn gọi hàm SuspendThread(GetCurrentThread())
    Func2 sau khi nhận xong dữ liệu thì ResumeThread lại cho Func1.
    PS : sao mà mình thấy cái hook của bạn có vẻ không ổn lắm, đã hook nạp thư viện vào rồi sao lại unhook nữa. về mặt lý thuyết sau khi unhook thì thư viện sẽ lại bị giải phóng ra khỏi process.
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 25-08-2008 lúc 09:00 PM.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    04 2008
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Lúc bạn chuyển dữ liệu từ Func1 thì bạn gọi hàm SuspendThread(GetCurrentThread())
    Func2 sau khi nhận xong dữ liệu thì ResumeThread lại cho Func1.
    PS : sao mà mình thấy cái hook của bạn có vẻ không ổn lắm, đã hook nạp thư viện vào rồi sao lại unhook nữa. về mặt lý thuyết sau khi unhook thì thư viện sẽ lại bị giải phóng ra khỏi process.
    Thế này bạn à, vì process của mình chạy trong thời gian dài, nên nếu hook trong suốt tiến trình thì rất tốn tài nguyên.Trong file hook mình viết 2 hàm hook và unhook,trong chương trình chính mình gọi hàm hook ,trong hàm hook sẽ gửi 1 message tới process cần hook, HookProc sẽ bắt message này ,load file hook vào process rồi gọi hàm unhook luôn.Cũng trong HookProc mình thay đổi WinProc đến NewWinProc mới của mình,như vậy kể từ thời điểm này mình đã ở trong process, mình muốn bắt event nào thì tùy mình.
    Nếu mình SuspendThread(GetCurrentThread()) thì tức là mình đã ngưng process rồi ,vì hàm Func1,func2 hoạt động trong chính NewWinProc. Thực ra thì mình mới vừa lên google search về Thread thôi .Giờ mình cũng có ý tưởng để vượt qua rào cản này rồi : khởi tạo 1 thread mới ,rồi thực hiện 2 hàm trong đó.Trước nay mình chỉ viết chương trình theo kiểu từ A->Z, cứ trong thread chính mà chơi không. Thank bạn đã gợi ý .
    Đã được chỉnh sửa lần cuối bởi donallinh : 25-08-2008 lúc 09:45 PM.

  4. #4
    Ngày gia nhập
    04 2008
    Bài viết
    6

    Bạn nào có tài liệu hoặc link nào hay về lập trình multithread có thể giới thiệu cho mình được không. Mình cũng mới tìm hiểu về lập trình trên Win thôi, mà lại toàn học kiểu chấp vá nên khốn khổ quá . Search trên google nó ra đủ thứ, con đọc MSDN thì không hiểu được nhiều.

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    MSDN là nhất rồi đó bạn. Chủ yếu là bạn chỉ cần nắm cấu trúc hàm CreateThread là đủ.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    04 2008
    Bài viết
    6

    Mặc định Cần hiểu về vấn đề delay 1 hàm

    Mình giải quyết như sau:
    Trong hàm NewWinProc mình xử lý sự kiện :

    LRESULT CALLBACK NewWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    if(usMg==MyMsg) //MyMsg là do mình đăng kí
    {
    CreateThread(NULL,0,ThreadProc,&x,0,NULL);
    // x là 1 biến toàn cục kiểu A;
    }
    return CallWindowProc(OldWndProc, hWnd, uMsg, wParam, lParam);
    /* trong đó :
    OldWndProc = (WNDPROC)SetWindowLong(hVLWnd, GWL_WNDPROC, (LONG)NewWndProc); là hàm mình đặt trong HookProc */
    };
    DWORD WINAPI ThreadProc( __in LPVOID lpParameter)
    {
    A * a=(A*)(lpParammeter);
    func1(a->thành phần 1);
    Sleep(TimeDelay);
    func2(a->thành phần 2);
    };

    Trong ThreadProc ,sau khi thực hiện func1,mình cho Sleep(TimeDelay) để cho process update dữ liệu (cứ sau 80ms update 1 lần) ,khi đó func2 sẽ xử lý dữ liệu mới nhất.
    Tuy nhiên khi test thì mình thấy khoảng 10 đến 20 lần thì có 1 vài lần hàm func2 không được thực thi. Mình không biết giữa thread của mình tạo với mainthread có "va chạm",hay " đụng độ" gì không? Bạn nào am hiểu về lập trình multithread giúp đỡ mình chút.

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

  1. hàm delay trong BC 5.2, giúp mình hàm delay với
    Gửi bởi comeonbaby trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 23-09-2011, 03:46 PM
  2. Sử dụng kết hợp 2 lệnh Delay();
    Gửi bởi minhtuan99bk trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 16-06-2010, 03:50 PM
  3. Lệnh delay() trong C
    Gửi bởi minhtuan99bk trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 06-07-2009, 08:30 PM
  4. Hàm Delay với Borland C++ v5.5
    Gửi bởi elliwood trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 28-03-2009, 08:17 PM
  5. Lỗi hàm delay()
    Gửi bởi thongnlkh_aptech trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 13-03-2009, 06:35 PM

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