Freeware

Ở đây tôi giữ một số chương trình của tôi mà tôi đã viết. Cả hai đều không thương mại và đã được phát triển khi cần thiết. Không có mã nguồn được cung cấp.

Bộ chuyển đổi FW3 sang TXT

Đây là một công cụ chuyển đổi tôi đã viết một ngày (năm 1999) khi tôi được yêu cầu giúp chuyển đổi các tệp tin Framework * .fw3. Vào thời điểm đó tôi không biết định dạng là gì và được sử dụng cho, không có hướng dẫn sử dụng nào cả. Vì vậy, công cụ chuyển đổi không chỉ giúp bạn luôn luôn trong trường hợp khi văn bản thuần được tạo ra và lưu trữ ở định dạng này. Mặc dù không có sự đảm bảo nào trong trường hợp của bạn. Ứng dụng MSDOS.  Chuyển đổi FW3

… Đây là một sự tiếp nối của câu chuyện: gần 5 năm sau tôi đã được hỏi lý do tại sao tôi chuyển đổi không làm việc với các tập tin văn bản đơn giản fw3 với văn bản tiếng Ý. Tôi không biết tại sao. Vì vậy, tôi bắt đầu một cuộc điều tra. Kết quả là FW3 sang TXT Converter 2.0 đã được tạo ra từ đầu. Nó vẫn còn khá tầm thường tiện ích nhưng phiên bản này nhận ra tiêu đề tập tin fw3, chân trang và bộ lọc cơ thể của mình đối với một định dạng TXT đơn giản. Đó là ứng dụng giao diện điều khiển Win32 với hiệu suất được cải thiện. Đã thêm nhiều tính năng như hỗ trợ ký tự đại diện và một số tùy chọn lọc. Sử dụng /? để được giúp đỡ. (Được kiểm tra: Win XP PRO + SP1 / 2K + SP4 / NT4 + SP6). Đặc biệt cảm ơn Tommaso Merkel (Studio Tecnos) để thử nghiệm và sửa nó dưới Win9x.  Chuyển đổi FW3 2.02.

Có một công cụ tốt đẹp khác cho FW3 chuyển đổi từ R & L; Phần mềm. Nó tốt hơn nhiều nhưng không phải là miễn phí.

Lưu ý, định dạng FW3 (cũng như tất cả các phiên bản sau) khá phức tạp / mạnh mẽ. Đôi khi nó không thể chuyển đổi nội dung thành một thứ có thể đọc được vì nội dung không phải là một văn bản. Hỏi Framework.com để được trợ giúp thêm nếu bạn cần tất cả dữ liệu quan trọng của mình.

Normal.dot

Một khi tôi đã viết rất nhiều bài báo khoa học cho cùng chủ đề, thuật ngữ chung đã được sử dụng và nhiều thuật ngữ đã được lặp lại. Tôi đã mệt mỏi với việc in một từ rất dài từ và viết một macro cho MS Word để lưu trữ và nhanh chóng nhớ lại tất cả những từ này kết hợp. Tôi cũng đã điều chỉnh thanh công cụ để truy cập nhanh vào chữ Hy Lạp và định dạng đoạn văn. Kể từ khi tôi giữ bình thường này.dot mẫu sang một bên. Như bạn biết, nó lưu tất cả các thiết lập người dùng thích cho bộ xử lý văn bản của Word. Ở đây bạn có thể tải về normal.dot và tệp tin AVI để xem một cách an toàn hoạt động như thế nào. MS Word 97/2000 tương thích. Chỉ cần thay thế cái cũ hoặc nhập các thiết lập và vĩ mô   normal.zip

Công việc của phòng thí nghiệm colormetric

Một lần nữa tôi được yêu cầu “sáng chế” cái gì đó để cho học sinh biết màu sắc là gì và cách chúng tồn tại. Công việc phòng thí nghiệm này là kết quả. Có màu cơ bản được xem xét, màu sắc hỗn hợp, bão hòa, độ sáng và độ tương phản được giải thích. Đường cong của tầm nhìn, vị trí màu sắc và các vấn đề khác được trình bày. Hệ điều hành: MS-DOS, ngôn ngữ giao diện: tiếng Nga. Để bắt đầu chạy start.bat để bật các trang mã đúng   colorlab.zip

SerialConfig

Một trong những dự án của tôi đã được xử lý chặt chẽ với PC giao tiếp nối tiếp. Vì vậy, tôi đã cố gắng để làm cho một tiện ích để giúp tôi một chút. Tôi đã thực hiện một, nhưng vì thiếu thời gian gửi dữ liệu đã không được thực hiện. Nó cho phép để mở COM1 / COM2, thiết lập / nhận cài đặt cổng, giám sát dữ liệu gửi đến cho opend cổng. Nó không hoàn hảo thực sự. Một trong những hoàn hảo nhất mà tôi đang phát triển trong thời gian rảnh rỗi của tôi và hy vọng nó sẽ, cuối cùng, “làm cho ước mơ của tôi trở thành sự thật” những gì các tiện ích giao tiếp nối tiếp máy tính nên được.  SerialConfig.zip

Wave In Sensor

Dự án khoa học của tôi đã được xử lý tổng hợp và xử lý tín hiệu. Điều thú vị là chúng ta làm thế nào để có thể sử dụng các khả năng PC để xử lý các tín hiệu băng thông âm thanh và tôi đã viết điều này. Chương trình này là một máy phân tích hình oscilloscope / spectra rất đơn giản, nó cho thấy tất cả đầu vào của card âm thanh trong miền thời gian hoặc tần số. Thực hiện quy mô V / H. FFT được sử dụng cho các bản vẽ phổ. Hệ điều hành được thử nghiệm: Win98. Ngôn ngữ giao diện: Tiếng Nga   WaveInSensor.zip

List Extractor

Tôi gọi nó theo cách này bởi vì nó trích ra các địa chỉ đăng ký yêu cầu từ đầu vào * .lst file bởi các tên reg được chỉ định trong một tập tin đầu vào. Vấn đề nêu ra cho Microchip microcontrollers lập trình ASM. Trong trường hợp của tôi địa chỉ đăng ký đã được chỉ định bởi incrementing với một.  lst_extr.zip

Khởi động lại, đăng xuất tiện ích

Một khi tôi đã viết một tiện ích trợ giúp đơn giản cho Windows để thực hiện tất cả những hành động này từ dòng lệnh hoặc tập tin thực thi. Đây là đầu ra của nó. Với các tham số dòng lệnh rỗng không có gì nhưng hiển thị một trợ giúp:

Cách sử dụng: khởi động lại [-option1] [-option2]
Lựa chọn 1:
        đăng xuất
        tắt nguồn
        khởi động lại
        tắt
Lựa chọn 2:
        lực lượng
Mặc định: reboot
Expample: khởi động lại - khởi động lại

Có một cái gì đó tương tự trong mạng và MS Resource Kit, nhưng tôi thích của tôi.  reboot.zip

Tính toán Bitrate Phim Mã hóa

Tiện ích mã nguồn mở HTML, Cười, được thực hiện như một người trợ giúp nhỏ để tính toán bitrate mã hóa cho video gia đình. Đối với bộ phim lengh (phút), kích thước tập tin mong muốn mong muốn hoặc dung lượng đĩa CD (Mb) và tốc độ bit âm thanh yêu cầu (kbit / s), nó sẽ tính toán tốc độ bit mã hóa video cần thiết (kbit / s) và cho giá trị cho các tệp video và âm thanh kết quả nếu không được sáp nhập. Yêu cầu bật JScript. IE 6.0 và NS 7.0 đã chứng minh.

Tạo các điều khiển ActiveX của riêng bạn

1. Giới thiệu

yếu tố kiểm soát ActveX – một tập tin với phần mở rộng OCX (ví dụ, MyButton.OCX), mà bạn có thể sử dụng trong ứng dụng của bạn Visual C ++. Visual C ++ và ngôn ngữ lập trình trực quan khác cho phép bạn kích hoạt các điều khiển ActiveX trong chương trình và sử dụng nó trong cùng một cách như kiểm soát ++ Visual C chuẩn. Bạn đặt điều khiển ActiveX trong hộp thoại, thiết lập thuộc tính của nó và liên kết mã với các sự kiện của nó. Sau khi bạn đã tạo điều khiển ActiveX của riêng mình, bạn có thể chuyển nó cho các lập trình viên khác có thể nhập nó vào các chương trình của họ.

Bởi vì phần mở rộng tệp điều khiển ActiveX là .OSX, đôi khi điều khiển ActiveX được gọi là các phần tử OSX.
Trong chương này, bạn sẽ phát triển kiểm soát của bạn riêng ActiveX – MyClock.OSKH, thực hiện nhiệm vụ của màn hình hiển thị thời gian hiện tại. Khi các lập trình viên đặt các điều khiển MyClock.OXX trong các hình thức hoặc trong hộp thoại, MyClock. OCX sẽ liên tục hiển thị thời gian hiện tại.

 

2. Tạo một dự án

Để tạo một dự án điều khiển MyClock.OCX:

1) Chọn Mới từ trình đơn Tệp.
Đáp lại, Visual C ++ hiển thị hộp thoại Mới.
2) Chọn tab Dự án của hộp thoại Mới.
3) Chọn MFC ActiveX ControlWizard từ danh sách các loại dự án
4) Kiểu MyClock trong cửa sổ Tên Dự án.
5) Nhấp vào nút nằm ở phía bên phải của cửa sổ Vị trí và chọn thư mục cho dự án.
6) Nhấp vào nút OK.
Để đáp ứng, Visual C ++ sẽ hiển thị cửa sổ MFC ActiveX ControlWizard Bước 1 trong 2
Trong cửa sổ ActiveX ControlWizard Bước 1, để tất cả các thiết lập ở trạng thái mặc định và nhấp vào nút Tiếp theo.
Trong ActiveX ControlWizard Bước 2, để tất cả các thiết lập ở trạng thái mặc định và nhấp vào nút Finish.
Đáp lại, Visual C ++ hiển thị hộp thoại New Project Information.
Nhấn OK trong hộp thoại New Project Information và chọn Set Active Configuration từ thực đơn Build.
Đáp lại, Visual C ++ hiển thị hộp thoại Set Active Project Configuration.
Chọn MyClock – Win32 Release trong hộp thoại Set Active Project Configuration và kích OK.
Đó là tất cả! Bạn đã hoàn thành việc tạo ra các dự án tập tin và các wireframes của MyClock ActiveX kiểm soát các tập tin.

 

3. Thiết lập biểu tượng công cụ MyClock

Biểu tượng công cụ MyClock hiển thị các ký tự OCX. Bạn cần phải cấu hình kiểm soát MyClock để biểu tượng công cụ của nó là một đồ họa đồng hồ. Để cấu hình biểu tượng công cụ MyClock, bạn phải chỉnh sửa bitmap IDB_MYCLOCK. Hình ảnh này được tạo ra bởi Visual C ++.
Để hiển thị bitmap IDB_MYCLOCK trong chế độ thiết kế, hãy thực hiện theo các bước sau:

1) Chọn thẻ ResourceView trong cửa sổ Workspace Workspace, mở rộng tài nguyên MyClock, mở rộng mục Bitmap, và nhấp đúp vào IDB_MYCLOCK.
Đáp lại, Visual C ++ sẽ hiển thị bitmap IDB_MYCLOCK trong chế độ thiết kế.
2) Sử dụng các công cụ trực quan của Visual C ++, thay thế hình ảnh raster IDB_MYCLOCK của các chữ cái OCX với bản vẽ của đồng hồ đơn giản nhất (vòng tròn và hai dòng như các mũi tên).

 

4. Vẽ trong kiểm soát MyClock

Trong khi điều khiển MyClock hiển thị một hình elip. Bạn cần MyClock để hiển thị thời gian hiện tại, vì vậy bạn cần phải viết mã thích hợp:
Mở tập tin MyClockCtl.cpp.
Tệp MyClockCtl.cpp là tệp thực hiện cho kiểm soát MuClock mà bạn đã tạo cho Visual C ++; Trong tệp này, bạn sẽ viết mã của bạn để cấu hình MyClock.
Tìm hàm OnDraw () trong MyClockCtl.cpp và viết đoạn mã sau:

VOID CMYCLOCKCTRL :: ONDRAW (CDC * PDC, CONST CRECT & RCBOUNDS, CONST CRECT & RCINVALID) { // TODO: THAY THẾ MÃ SAU BẰNG BẢN VẼ CỦA RIÊNG BẠN // CODE. / / ĐỔ ĐIỀU KHIỂN BẰNG MÀU ĐÃ CHỌN. PDC-> FILLRECT (RCBOUNDS, CBRUSH :: FROMHANDLE ((HBRUSH) GETSTOCKOBJECT (WHITE_BRUSH)))); CHAR CURRENTTIME [30]; STRUCT TM * NEWTIME; DÀI LTIME; // LẤY THỜI GIAN HIỆN TẠI THỜI GIAN (& LTIME); NEWTIME = LOCALTIME (& LTIME); // CHUYỂN ĐỔI THỜI GIAN THÀNH MỘT CHUỖI. STRCPY (CURRENTTIME, ASCTIME (NEWTIME)); / / HOÀN THÀNH DÒNG VỚI MỘT KÝ TỰ KHÔNG GIAN. CURRENTTIME [24] = ”; // THÊM MỘT CHUỖI HẠN CHẾ KÝ TỰ. CURRENTTIME [25] = 0; // IN THỜI GIAN HIỆN TẠI PDC-> EXTTEXTOUT (RCBOUNDS.LEFT, RCBOUNDS.TOP, ETO_CLIPPED, RCBOUNDS, CURRENTTIME, STRLEN (CURRENTTIME), NULL); }

 

5. Hiển thị thời gian hiện tại ở chế độ liên tục

Để hiển thị thời gian liên tục, bạn cần phải thực hiện theo các bước sau:
1) Viết mã lệnh đặt một bộ đếm thời gian với khoảng thời gian 1000 millisecond cho điều khiển MyClock.
2) Liên kết mã với sự kiện WM_TIMER của điều khiển MyClock.
Sau khi thiết lập bộ định thời mỗi 1000 mili giây (mỗi giây), Windows sẽ gửi một thông báo WM_TIMER đến bộ điều khiển MyClock, để đáp ứng mã mà bạn liên kết với sự kiện điều khiển này sẽ được thực hiện. Mã này sẽ đơn giản xuất ra thời gian hiện tại, vì vậy giá trị thời gian sẽ được cập nhật liên tục.
Bộ đếm thời gian phải được cài đặt ngay sau khi tạo điều khiển, vì vậy bạn cần kết hợp mã để đặt thời gian cho sự kiện WM_CREATE của điều khiển:
Hiển thị hộp thoại ClassWizard bằng cách chọn ClassWizard từ trình đơn View. Trên trang Bản đồ Thư, hãy chọn sự kiện sau:

Tên Lớp: CMyClockCtrl Tổ Chức
ID: CMyClockCtrl
Thư: WM_CREATE

Nhấp vào nút Thêm chức năng.
Đáp lại, Visual C ++ sẽ thêm hàm OpCreate () vào lớp CMyClockCtrl.
Nhấp vào nút Chỉnh sửa mã trong ClassWizard.
Đáp lại, Visual C ++ sẽ mở tệp MyClockCtrl.cpp với chức năng OnCreate () trong chế độ chỉnh sửa.
Viết mã sau trong hàm OnCreate ():

INT CMYCLOCKCTRL :: ONCREATE (LPCREATESTRUCT LPCREATESTRUCT) { NẾU (COLECONTROL :: ONCREATE (LPCREATESTRUCT) == -1) RETURN -1; // TODO: THÊM MÃ TẠO ĐẶC BIỆT CỦA BẠN Ở ĐÂY // ĐẶT HẸN GIỜ. SETTIMER (1, 1000, NULL); TRỞ LẠI 0; }

bạn nhập mã bao gồm một nhà điều hành duy nhất, mà làm cho SetTimer () để thiết lập bộ đếm thời gian đến 1000 thời gian ms:

SetTiltier (1, 1000, NULL);

Từ bây giờ, mỗi 1000 mili giây Windows sẽ gửi một thông báo WM_TIMER tới bộ điều khiển.
Bây giờ bạn cần liên kết mã với sự kiện WM_TIMER:
Chọn ClassWizard từ trình đơn View. Trên trang Bản đồ Thư, hãy chọn sự kiện sau:

Tên Lớp: CMyClockCtrl
ID đối tượng: CMyClockCtrl
Message: WM_TIMER

Nhấp vào nút Thêm chức năng.
Đáp lại, Visual C ++ sẽ thêm chức năng OnTimer () vào lớp CMyClockCtrl.
Nhấp vào nút Chỉnh sửa mã trong ClassWizard.
Đáp lại, Visual C ++ sẽ mở tệp MyClockCtrl.cpp với chức năng OnTimer () trong chế độ chỉnh sửa.
Viết mã sau trong hàm OnTimerO:

VOID CMYCLOCKCTRL :: ONTIMER (UINT NIDEVENT) { // TODO: THÊM MÃ TRÌNH XỬ LÝ THƯ CỦA BẠN Ở ĐÂY VÀ / HOẶC GỌI / / MẶC ĐỊNH // CHUYỂN CUỘC GỌI ĐẾN CHỨC NĂNG ONDRAW (). INVALIDATECONTROL (); COLECONTROL :: ONTIMER (NIDEVENT); }

 

6. Cho phép các thuộc tính cơ bản trong ActiveX MyClock

Các thuộc tính cơ bản (Thuộc tính cổ phiếu) được xác định trước.
Dưới đây là danh sách các thuộc tính cơ bản:

Dáng vẻ bên ngoài – Xuất hiện (3 chiều hoặc bằng phẳng)
BackColor – Màu nền
BorderStyle – Khung Kiểu
Chú thích – Tiêu đề
Enabled – Tình trạng có sẵn / không có sẵn
Font – Font
ForeColor – màu Foreground
hWnd – Marker cửa sổ
readyState – Ready Status
chữ – Text

Để thực hành, chúng tôi bao gồm hai thuộc tính cơ bản trong ActiveX MyClock: BackColor và ForeColor.
Làm như sau:

View -> ClassWizard -> Tự động hóa (proverte đến lớp CMyClockCtrl cài đặt trong tên lớp cửa sổ)
Nhấn vào nút Thêm tài sản
Chọn BackColor từ danh sách và nhấn OK
Ngoài ra thêm và tài sản ForeColor.

Bộ điều khiển MyClock bây giờ có thuộc tính BackColor và ForeColor, nhưng chưa sử dụng các giá trị được lưu trữ trong các thuộc tính này. Bạn cần viết mã trong hàm OnDraw (), thực hiện công việc này:

VOID CMYCLOCKCTRL :: ONDRAW (CDC * PDC, CONST CRECT & RCBOUNDS, CONST CRECT & RCINVALID) { // TODO: THAY THẾ MÃ SAU BẰNG BẢN VẼ CỦA RIÊNG BẠN // CODE. / / ĐẶT MÀU NỀN TRƯỚC (MÀU CHỮ) PDC-> SETTEXTCOLOR (DỊCHCOLOR (GETFORECOLOR ())); // ĐẶT CHẾ ĐỘ NỀN TRONG SUỐT PDC-> SETBKMODE (TRANSPARENT); // TẠO MỘT BÀN CHẢI DỰA TRÊN GIÁ TRỊ BACKCOLOR CBRUSH BKBRUSH (DỊCHCOLOR (GETBACKCOLOR ())); // SƠN NỀN PDC-> FILLRECT (RCBOUNDS, & BKBRUSH); CHAR CURRENTTIME [30]; STRUCT TM * NEWTIME; DÀI LTIME; // LẤY THỜI GIAN HIỆN TẠI THỜI GIAN (& LTIME); NEWTIME = LOCALTIME (& LTIME); // CHUYỂN ĐỔI THỜI GIAN THÀNH MỘT CHUỖI. STRCPY (CURRENTTIME, ASCTIME (NEWTIME)); / / HOÀN THÀNH DÒNG VỚI MỘT KÝ TỰ KHÔNG GIAN. CURRENTTIME [24] = ”; // THÊM MỘT CHUỖI HẠN CHẾ KÝ TỰ. CURRENTTIME [25] = 0; // IN THỜI GIAN HIỆN TẠI PDC-> EXTTEXTOUT (RCBOUNDS.LEFT, RCBOUNDS.TOP, ETO_CLIPPED, RCBOUNDS, CURRENTTIME, STRLEN (CURRENTTIME), NULL); }

Vâng đó là tất cả, bây giờ kiểm soát MyClock có các thuộc tính của BackColor và ForeColor.

 

7. Cho phép một thuộc tính đặc biệt trong ActiveX MyClock

Trong nhiều trường hợp, bạn sẽ cần đưa vào thuộc tính kiểm soát của mình mà không có trong danh sách chuẩn. Những đặc tính này được gọi là đặc biệt.
Ví dụ, hãy bao gồm thuộc tính UpdateInterval đặc biệt trong MyClock – thời gian cập nhật:

View -> ClassWizard -> Tự động hóa (proverte tên cửa sổ lớp học được đặt lớp CMyClockCtrl)
Click vào nút tài sản Thêm
trong cửa sổ bên ngoài tên loại UpdateInterval
Trong các Loại hộp, chọn Dài
Trong Tên biến phải m_updateinterval
Cửa sổ chức năng thông báo đưa OnUpdateIntervalChanged
Kiểm tra xem Đảm bảo rằng nút Thành viên được chọn trong quá trình triển khai thực hiện và nhấp vào OK

Do đó, chúng tôi đã xác định rằng với tài sản UpdateInterval được liên kết m_updateinterval biến và bất cứ khi nào giá trị tài sản UpdateInterval imenyatsya sẽ tự động thực hiện chức năng OnUpdateIntervalChanged.
Bây giờ bạn cần phải khởi tạo thuộc tính UpdateInterval:

Mở tập tin MyClockCtl.cpp
Tìm () chức năng và napishiet DoPropExchange trong nó như sau:
// Khởi tạo thuộc tính UpdateInterval đến 1000
PX_Long (PPX, _T ( «UpdateInterval »), m_updateinterval, 1000);

Bây giờ chúng ta cần phải cập nhật các chức năng OnUpdateIntervalChanged:

// kiểm tra otrizatelnost
if (m_updateinterval <0)
{
MessageBox ( «tài sản này có thể không phải là BE tiêu cực !!!»);
m_updateinterval = 1000;
}
// Thiết lập bộ đếm thời gian
SetTimer (1, (UINT) m_updateinterval, NULL) ;

và OnCreate:

/ / Thiết lập bộ đếm thời gian
SetTimer (1, (UINT) m_updateinterval, NULL);

Làm thế nào để tải tập tin qua ftp?

Một khi tôi thiết kế tiện ích đơn giản để được sử dụng như ftp downloader để lấy cập nhật phần mềm từ máy chủ từ xa. Xem dự án làm việc cho MSVS6 để biết chi tiết. Ở đó bạn có thể tìm thấy:

  • làm thế nào để tạo ra phiên Internet
  • làm thế nào để thiết lập kết nối ftp
  • làm thế nào để sử dụng OnStatusCallbackchức năng
  • làm thế nào để liệt kê và duyệt danh sách các tập tin máy chủ ftp
  • làm thế nào để hiển thị biểu tượng liên kết cho mở rộng tập tin trong CListCtrl
  • làm thế nào để hiển thị tiến bộ trong khi tải tập tin
  • làm thế nào để tạo ra chủ đề cho các tập tin tải về và gián đoạn tải
  • cách duyệt đĩa cục bộ
  • làm thế nào để xử lý ngoại lệ
  • làm thế nào để sử dụng con trỏ động

Làm thế nào tôi có thể chờ đợi để chấm dứt thread?

Giả sử từ chủ đề chính chúng tôi tạo ra một chủ đề khác. Đó là suppoused để làm một số công việc và kết thúc. Đôi khi chủ đề chính muốn biết khi nào thread đã thoát. Thông thường họ đề nghị sử dụng một cái gì đó như thế này:

Xử lý hThread;
/ *
Tạo chủ đề,
thread làm một số công việc ...
Nó có thể thoát ra khỏi chính nó hoặc chúng tôi gửi tin nhắn đến thread để thoát.
* /
chuyển đổi (WaitForSingleObject (hThread, nTimeOut_IfAny)) {
	trường hợp WAIT_OBJECT_0:
		/ / Chủ đề đã đi, phản ứng bằng cách nào đó:
		fThreadFinished = true;
		phá vỡ;
	trường hợp WAIT_TIMEOUT:
		// Hết thời gian chờ, chủ đề vẫn đang chạy
		fThreadFinished = sai;
		phá vỡ;
	mặc định :
		// Có gì đó không đúng...
};

Lưu ý rằng việc chờ đợi này được thực hiện trong chủ đề chính, có thể có một số thông báo xuất hiện và từ chủ đề con quá. Nhưng chúng tôi không bơm thông báo này – điều đó rất tồi tệ. Điều này làm cho ứng dụng bị đông lạnh (không có phản hồi bằng bàn phím, không có bản cập nhật GUI). Nếu timeout quá dài và thread con sử dụng SendMessage()chức năng để gửi tin nhắn đến thread chính – bế tắc xảy ra. Để tránh điều này chúng ta cần phải chờ đợi cho thread và vẫn xử lý hàng đợi tin nhắn. Một khi tôi giải quyết nó theo cách này:

trong khi (true) {
 MSG msg;
 trong khi (PeekMessage (& msg ;, NULL, 0, 0, PM_REMOVE))
   DispatchMessage (& msg;);
   Kết quả DWORD = MsgWaitForMultipleObjects (1, & hThread ;, FALSE, nTimeOut, QS_ALLINPUT);
   if (result! = (WAIT_OBJECT_0 + 1))
      phá vỡ; / / Chủ đề là đã thoát
}

Điều này đã giúp. Sau đó tôi đã được khuyên để xem cách ATL chức năng AtlWaitWithMessageLoop()được thực hiện. Tôi thấy phương pháp của tôi gần đúng. Đây là một đoạn mã của hàm đó (ATLBASE.h):

BOOL AtlWaitWithMessageLoop (HANDLE hEvent)
{
  DWORD dwRet;
  MSG msg;

  trong khi (1)
  {
    dwRet = MsgWaitForMultipleObjects (1, & hEvent ;, FALSE, INFINITE, QS_ALLINPUT);

    if (dwRet == WAIT_OBJECT_0)
       trả về TRUE; // Sự kiện được báo hiệu

    if (dwRet! = WAIT_OBJECT_0 + 1)
       phá vỡ; // Có chuyện gì khác đã xảy ra

    // Có một hoặc nhiều thông báo cửa sổ khả dụng. Gửi chúng
    trong khi (PeekMessage (& msg, NULL, NULL, NULL, PM_REMOVE))
    {
      TranslateMessage (& msg;);
      DispatchMessage (& msg;);
      if (WaitForSingleObject (hEvent, 0) == WAIT_OBJECT_0)
         trả về TRUE; // Sự kiện hiện báo hiệu.
    }
  }
  trả về FALSE;
}

nơi đầu vào hEventlà xử lý chủ đề. Chức năng này sẽ không trở lại cho đến khi sợi còn sống nhưng hàng đợi tin nhắn của thread gọi (thường là một chính) sẽ được bơm.

Là một tác dụng phụ tôi đã sửa đổi các chức năng để sử dụng nó thay vì Sleep()chức năng dummy API . Bạn có thể chờ đợi cho chủ đề bây giờ có hoặc không có thời gian chờ hoặc chỉ cần chờ đợi một thời gian nhất định mà không khóa hàng đợi tin nhắn. Cuộc gọi: waitWithMessageLoop(0, 2000)waitWithMessageLoop(hThread),waitWithMessageLoop(hThread, 5000)

BOOL waitWithMessageLoop (HANDLE hEvent = 0, DWORD dwTimeout = INFINITE);

BOOL chờ đợiMessageLoop (HANDLE hEvent, DWORD dwTimeout)
{
  DWORD dwRet;
  MSG msg;
  hEvent = hEvent? hEvent: CreateEvent (NULL, FALSE, FALSE, NULL);
  
  trong khi (đúng)
  {
    dwRet = MsgWaitForMultipleObjects (1, & hEvent ;, FALSE, dwTimeout, QS_ALLINPUT);
    if (dwRet == WAIT_OBJECT_0)
       trả về TRUE;
    if (dwRet! = WAIT_OBJECT_0 + 1)
       phá vỡ;
    trong khi (PeekMessage (& msg, NULL, NULL, NULL, PM_REMOVE))
    {
      TranslateMessage (& msg;);
      DispatchMessage (& msg;);
      if (WaitForSingleObject (hEvent, 0) == WAIT_OBJECT_0)
         trả về TRUE;
    }
  }
  trả về FALSE;
}

Làm thế nào để chương trình cổng nối tiếp trong Windows?

Làm thế nào để chương trình cổng nối tiếp trong Windows?

Đối với truyền thông nối tiếp theo Windows cách tiếp cận phổ biến là sử dụng các chức năng API hoặc lớp bên thứ ba mà bao bọc chúng. Không có nhiều truy cập trực tiếp vào cổng đăng ký, nếu bạn không phát triển trình điều khiển thiết bị, của cource (đối với Win9x bạn vẫn có thể sử dụng như kỹ thuật-DOS-như lập trình, nhưng trong Win NT / 2K quên nó!).

Trước tiên, hãy xem những gì MSDN nói ở đây hoặc ở đây cho điều này. Nếu bạn vẫn không hài lòng truy cập vào CodeProject để tìm lớp wrapper cổng COM thích hợp . Cuối cùng, cũng có một điều khiển Microsoft ActiveX có tên MSComm cho mục đích này, nhưng hãy cẩn thận …

Tại sao tôi cần một destructor ảo?

Destructor ảo là một thực thể thiết yếu nếu bạn sử dụng thừa kế. Destructor ảo được khai báo trong một lớp cơ sở. Nó đảm bảo rằng đối với tất cả các lớp có nguồn gốc từ lớp cơ sở tất cả các destructors: 1) sẽ được gọi và 2) sẽ được gọi theo thứ tự đúng. Nó tạo ra một hành vi đa hình. Hãy xem đoạn trích dưới đây:

#include "stdio.h"

lớp BaseClass
{
	int id;
công cộng:
	BaseClass () {printf ("BaseClass () \ n"); }
	ảo ~ BaseClass () {printf ("~ BaseClass () \ n"); } // !!!
};

lớp Class1: public BaseClass
{
	int id;
công cộng:
	Class1 () {printf ("Class1 () \ n"); }
	~ Class1 () {printf ("~ Class1 () \ n"); }
};

lớp Class2: public Class1
{
	int id;
công cộng:
	Class2 () {printf ("Class2 () \ n"); }
	~ Class2 () {printf ("~ Class2 () \ n"); }
};


int main (int argc, char * argv [])
{
	BaseClass * p = new Class2;
	xóa p;

	trở lại 0;
}

Đầu ra trong trường hợp không có destructor ảo là:

BaseClass ()
Class1 ()
Lớp 2 ()
~ BaseClass ()

Nhưng đầu ra trong trường hợp với destructor ảo khác:

BaseClass ()
Class1 ()
Lớp 2 ()
~ Lớp 2 ()
~ Lớp 1 ()
~ BaseClass ()

Bây giờ bạn thấy những gì sẽ xảy ra nếu destructor nên gọi delete()cho một số đối tượng / mảng được sử dụng trong lớp học? Tiếp tục: sử dụng destructor ảo để đảm bảo thanh toán bù trừ bộ nhớ chính xác trong trường hợp sử dụng thừa kế.

Bài test

Học lập trình C cơ bản và nâng cao] Ngôn ngữ C là ngôn ngữ chương trình máy tính theo câu lệnh, thủ tục và theo mục đích chung được phát triển năm 1972 bởi Dennis M. Ritchie ở Bell Telephone lab để phát triển Hệ điều hành UNIX.

Ngôn ngữ C là ngôn ngữ máy tính được sử dụng rộng rãi nhất, nó cùng với ngôn ngữ Java là những ngôn ngữ lập trình phổ biến hàng đầu, được sử dụng rất rộng rãi trong giới lập trình viên hiện đại.

Dưới đây là danh sách các bài hướng dẫn học C cơ bản và nâng cao: