Tôi đang phát triển một công cụ kiểm tra để tạo dạng sóng từ cổng song song PC. Công cụ này được thiết kế để tạo ra bất kỳ dạng sóng nào với độ chính xác thời gian của ms, vì vậy tôi sử dụng kịch bản lệnh Lua để xác định dạng sóng, GUI bắt đầu QThread mới để chạy tập lệnh khi người dùng nhấp vào nút [Bắt đầu].nanosleep() gọi từ Lua script đã tạm dừng luồng QT GUI
Ba chức năng sau cho Lua được thực hiện như các chức năng toàn cầu C++:
- pwrite: ghi dữ liệu vào cổng song song.
- msleep: đợi một số ms nhất định (được thực hiện bằng nanosleep())
- in: ghi đè hàm in mặc định Lua, chức năng này sẽ thêm thông điệp vào một tiện ích QTextEdit.
khi pwrite được gọi, dữ liệu ghi được lưu trữ trong biến toàn cầu, sau đó GUI được cập nhật với khoảng 20ms để cập nhật dữ liệu cổng song song trên GUI. (20ms khoảng thời gian làm mới này không phải là một thiết kế tốt, nhưng tôi đã không tìm ra cách sử dụng tín hiệu để thực hiện cập nhật GUI khi dữ liệu thay đổi).
Công cụ này về cơ bản hoạt động ngay bây giờ. Đầu ra dạng sóng không có vấn đề gì, nhưng việc cập nhật dữ liệu cổng song song có một số vấn đề:
Khi Lua gọi msleep, GUI chỉ dừng lại, dữ liệu cổng song song chỉ cập nhật sau khi kết thúc msleep.
Vì vậy, câu hỏi của tôi là:
Làm thế nào để thực hiện các phương pháp ngủ để nó sẽ không dừng lại thread GUI từ cập nhật?
Cách triển khai pwrite, sao cho GUI có thể nhận tín hiệu để cập nhật dữ liệu cổng song song khi dữ liệu ghi thay đổi?
Chương trình GUI như liên kết dưới đây:
Mã liên quan:
/* common.cpp file */
int L_MSleep(lua_State* l)
{
int milisec=0;
struct timespec req={0, 0};
time_t sec;
milisec=luaL_optint(l,1,0); // obtain parameter
if (milisec==0)
return 0;
sec=(int)(milisec/1000);
milisec=milisec-(sec*1000);
req.tv_sec=sec;
req.tv_nsec=milisec*1000000L;
while(nanosleep(&req,&req)==-1)
continue;
return 1;
}
/* LuaRunner.cpp file */
LuaRunner::LuaRunner(QObject *parent) :
QThread(parent)
{
runlua = false;
}
void LuaRunner::run()
{
QString err = "";
runlua = true;
LUA_RunScript(this->ff, err);
runlua = false;
if(err != "")
{
emit errorMessage(err);
}
}
int LuaRunner::LUA_RunScript(QString ff, QString &err)
{
L = lua_open();
luaL_openlibs(L);
if (luaL_loadfile(L, ff.toAscii()) || lua_pcall(L, 0, 0, 0))
{
err = QString(lua_tostring(L, -1));
return -1;
}
lua_register(L, "ssleep", L_SSleep);
lua_register(L, "msleep", L_MSleep);
lua_register(L, "pwrite", L_PortWrite);
lua_register(L, "print", L_Log);
lua_getglobal(L, "dotest");
if (!lua_isfunction(L, -1))
{
err = QString("Test function(dotest) should be a function");
return -1;
}
if(lua_pcall(L, 0, 0, 0))
{
err = QString(lua_tostring(L, -1));
return -1;
}
lua_close(L);
return 0;
}