Độ trễ pascal miễn phí

// 1. Sự chậm trễ

thủ tục Độ trễ(dwMilliseconds. longint);
var
iStart, iStop. DẠNG CHỮ;
bắt đầu
tôi bắt đầu. = GetTickCount;
nói lại
Tôi dừng lại. = GetTickCount;
Ứng dụng. Tin nhắn xử lý;
Ngủ(1);
cho đến khi (iStop - iStart) >= dwMilliseconds;
kết thúc;

// 2. Sự chậm trễ. với API

thủ tục Trễ (msec. longint);
var
thời gian mục tiêu. longint;
tin nhắn. TMsg;
bắt đầu
thời gian mục tiêu. = GetTickCount + msec;
trong khi thời gian đích > GetTickCount làm
nếu PeekMessage(Msg, 0, 0, 0, PM_REMOVE) thì
bắt đầu
nếu Msg. thông báo = WM_QUIT sau đó
bắt đầu
PostQuitMessage(Msg. wParam);
Nghỉ;
kết thúc;
TranslateMessage(Msg);
DispatchMessage(Msg);
kết thúc;
kết thúc;

{
Ghi chú
Thời gian đã trôi qua được lưu trữ dưới dạng giá trị DWORD
Do đó, thời gian sẽ quay quanh đến không nếu hệ thống là
chạy liên tục trong 49. 7 ngày
}

// 3. Ngủ

{
Chức năng Ngủ tạm dừng việc thực hiện của dòng điện
chủ đề cho một khoảng thời gian được chỉ định
}

Ngủ (dwMilli giây. Từ);

// 4. Độ trễ kết hợp

{
Bao gồm ngủ trong vòng lặp ngăn ứng dụng không ăn cắp
100% của CPU để thực tế không làm gì ngoài việc chạy quanh vòng lặp
}

thủ tục PauseFunc(chậm trễ. DWORD);
var
lTicks. DẠNG CHỮ;
bắt đầu
lTicks. = GetTickCount + chậm trễ;
nói lại
Ngủ (100);
Ứng dụng. Tin nhắn xử lý;
cho đến khi (lTicks <= GetTickCount) hoặc Ứng dụng. Chấm dứt;
kết thúc;

// 5. tiết kiệm tài nguyên hơn

thủ tục Trễ (Mili giây. số nguyên);
{của Hagen Reddmann}
var
đánh dấu. DẠNG CHỮ;
Biến cố. Xử lý;
bắt đầu
Biến cố. = CreateEvent(nil, False, False, nil);
cố gắng
đánh dấu. = GetTickCount + DWORD(Mili giây);
trong khi (Mili giây > 0) và
(MsgWaitForMultipleObjects(1, Sự kiện, Sai, Mili giây,
QS_ALLINPUT) <> WAIT_TIMEOUT) làm
bắt đầu
Ứng dụng. Tin nhắn xử lý;
mili giây. = Tick - GetTickCount;
kết thúc;
cuối cùng
CloseHandle(Sự kiện);
kết thúc;
kết thúc;


Xin chào,

Tôi đã phát triển một chương trình Turbo Pascal DOS vào năm 1992. Phiên bản của TP là 4. 5
hoặc sớm hơn,
nhưng tôi không chắc lắm. Tôi đã sử dụng lệnh Trì hoãn trong mã cho bộ đếm
chức năng thời gian
(để đếm giây)

Bảy năm sau, trên chiếc Pentium II 266 của tôi, bộ đếm của tôi hoạt động quá nhanh. tôi vẫn
có nguồn
Nhưng tôi không có trình biên dịch. Làm thế nào tôi có thể nhận được nó?

Cảm tạ

marc

tôi đang tìm cách làm cho chương trình của tôi phải đợi trước khi tiếp tục sang dòng mã tiếp theo. tôi biết một chức năng tồn tại, nó thậm chí là một chức năng tôi đã sử dụng trước đây. nhưng kể từ đó tôi đã xóa cả chương trình mà tôi đã sử dụng và quên tất cả về nó

mục đích của tôi là sử dụng các vòng lặp để thực hiện thay đổi lặp lại cho một thành phần, nhưng với thời gian trước mỗi lần lặp lại để người dùng có thể thấy hiệu quả. tôi hy vọng điều này có ý nghĩa

tôi đã tìm kiếm sơ qua diễn đàn và không tìm thấy cái này được liệt kê ở đâu khác nhưng tôi xin lỗi trước nếu tìm kiếm của tôi không đủ kỹ lưỡng

Xin lưu ý rằng việc chuyển sang ngôn ngữ khác khi đọc một bài đăng sẽ không đưa bạn đến cùng một bài đăng, bằng tiếng Hà Lan, vì không có bản dịch cho bài đăng đó



Đã phát hiện chặn quảng cáo

Vui lòng xem xét việc tắt trình chặn quảng cáo của bạn cho trang web của chúng tôi
Chúng tôi dựa vào những quảng cáo này để có thể chạy trang web của chúng tôi
Tất nhiên, bạn có thể hỗ trợ chúng tôi theo những cách khác (xem )

Delphi, Lazarus, Pascal miễn phí

Vì vậy, tôi đã phải thêm một sự chậm trễ (nói tốt hơn. sleep) trong mã của tôi, để sau khi hiển thị thông báo trạng thái tạm thời, sẽ trở lại thông báo trước đó. Giống như một tiếng bíp ngắn hiển thị thông báo và sau đó quay lại nơi chúng tôi đã dừng lại

Bây giờ chức năng sleep() có một vấn đề nhỏ. nó hoàn toàn khóa ứng dụng của bạn (chuột Zzz hoặc bóng quay) và người dùng thực sự không thể làm gì

Với một thủ thuật nhỏ, bạn có thể làm điều này tốt hơn;

procedure MyDelay(DelayTickCount: DWORD);
  var
    StartTickCount : DWORD;
  begin
    StartTickCount := GetTickCount;
    while (GetTickCount < StartTickCount + DelayTickCount) and (not Application.Terminated) do
      Application.ProcessMessages;
  end;   

Vì vậy, chức năng này KHÔNG khóa giao diện người dùng của bạn, nhưng sẽ đợi các bước tiếp theo trong mili giây "DelayTickCount"


Vì các chức năng trước sử dụng GetTickCount, chức năng này có vấn đề và GetTickCount64 có vẻ là lựa chọn tốt hơn, bạn cũng có thể muốn xem xét giải pháp thay thế bên dưới, sử dụng TDateTime thay vào đó, nơi chúng tôi có thể đặt độ trễ tính bằng mili giây (1000=1 giây)