Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Mesin Negeri Boleh Menyelesaikan Masalah Pengambilan Data Tidak Lengkap Apabila Menghantar Urutan Perintah dan Menunggu Respons?
Dalam senario anda, benang bertindak balas kepada kaedah baca/tulis yang menyekat, menunggu sehingga ia mengesan kata kunci atau tamat masa menggunakan waitForKeyword(). Malangnya, apabila readLines() digunakan untuk menguji aplikasi, hanya sebahagian kecil fail diperoleh. Selain itu, readLines serta-merta mengembalikan palsu semasa lelaran kedua tanpa menunggu tamat masa.
Isu ini berpunca daripada reka bentuk readLines(), yang membaca semua data yang tersedia dan memisahkannya kepada garisan. Apabila urutan perintah sedang diproses, readLines() hanya membaca bahagian pertama fail kerana ia tidak mengesan kata kunci. Selepas itu, apabila ia dipanggil semula, readLines() mengembalikan false kerana ia telah diulang ke atas keseluruhan data yang tersedia.
Untuk menghantar urutan perintah dengan berkesan dan menunggu arahan itu maklum balas, pertimbangkan untuk menggunakan pendekatan mesin keadaan. Ini menyediakan kaedah berstruktur dan boleh dipercayai untuk mengurus aliran arahan dan respons, memastikan bahawa respons yang dijangka diterima sebelum meneruskan.
Coretan berikut menunjukkan pelaksanaan mesin keadaan menggunakan Qt's QStateMachine dan kelas yang berkaitan:
class Programmer : public StatefulObject { Q_OBJECT AppPipe m_port { nullptr, QIODevice::ReadWrite, this }; State s_boot { &m_mach, "s_boot" }, s_send { &m_mach, "s_send" }; FinalState s_ok { &m_mach, "s_ok" }, s_failed { &m_mach, "s_failed" }; public: Programmer(QObject * parent = 0) : StatefulObject(parent) { connectSignals(); m_mach.setInitialState(&s_boot); send (&s_boot, &m_port, "boot\n"); expect(&s_boot, &m_port, "boot successful", &s_send, 1000, &s_failed); send (&s_send, &m_port, ":HULLOTHERE\n:00000001FF\n"); expect(&s_send, &m_port, "load successful", &s_ok, 1000, &s_failed); } AppPipe & pipe() { return m_port; } };
Dalam contoh ini, Programmer merangkum mesin keadaan dan menyediakan antara muka untuk berkomunikasi dengan peranti. Peralihan keadaan ditakrifkan menggunakan fungsi send() dan expect() untuk mengendalikan arahan penghantaran dan menunggu respons yang dijangkakan, masing-masing.
Menggunakan mesin keadaan mempunyai beberapa kelebihan:
Atas ialah kandungan terperinci Bagaimanakah Mesin Negeri Boleh Menyelesaikan Masalah Pengambilan Data Tidak Lengkap Apabila Menghantar Urutan Perintah dan Menunggu Respons?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!