นี่คือการแทนที่ QtSingleApplication สำหรับ Qt5
และ Qt6
เก็บอินสแตนซ์หลักของแอปพลิเคชันของคุณและทำลายอินสแตนซ์ที่ตามมาแต่ละรายการ โดยสามารถ (หากเปิดใช้งาน) ทำให้เกิดอินสแตนซ์รอง (ไม่เกี่ยวข้องกับอินสแตนซ์หลัก) และสามารถส่งข้อมูลไปยังอินสแตนซ์หลักจากอินสแตนซ์รองได้
คุณสามารถดูข้อมูลอ้างอิงการใช้งานฉบับเต็มและตัวอย่างได้ที่นี่
คลาส SingleApplication
สืบทอดมาจากคลาส Q[Core|Gui]Application
ใดก็ตามที่คุณระบุผ่านมาโคร QAPPLICATION_CLASS
( QCoreApplication
เป็นค่าเริ่มต้น) การใช้งานเพิ่มเติมจะคล้ายกับการใช้คลาส Q[Core|Gui]Application
คุณสามารถใช้ไลบรารีได้เหมือนกับว่าคุณใช้คลาสที่ได้รับ QCoreApplication
อื่น ๆ:
# include < QApplication >
# include < SingleApplication.h >
int main ( int argc, char * argv[] )
{
SingleApplication app ( argc, argv );
return app. exec ();
}
หากต้องการรวมไฟล์ไลบรารี ฉันขอแนะนำให้คุณเพิ่มมันเป็นโมดูลย่อย git ให้กับโปรเจ็กต์ของคุณ นี่คือวิธีการ:
git submodule add https://github.com/itay-grudev/SingleApplication.git singleapplication
คิวเมค:
จากนั้นรวมไฟล์ singleapplication.pri
ไว้ในไฟล์โปรเจ็กต์ .pro
ของคุณ
include ( singleapplication/singleapplication.pri )
DEFINES += QAPPLICATION_CLASS = QApplication
ซีเมค:
จากนั้นรวมไดเร็กทอรีย่อยในไฟล์โปรเจ็กต์ CMakeLists.txt
ของคุณ
set (QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication" )
add_subdirectory (src/third-party/singleapplication)
target_link_libraries ( ${PROJECT_NAME} SingleApplication::SingleApplication)
การรวมพื้นที่เก็บข้อมูลนี้เป็นโมดูลย่อย Git โดยตรง หรือแม้แต่สำเนาซอร์สโค้ดแบบตื้นลงในโปรเจ็กต์ใหม่อาจไม่เหมาะเมื่อใช้ CMake อีกทางเลือกหนึ่งคือการใช้โมดูล FetchContent
ของ CMake ซึ่งมีให้ใช้งานตั้งแต่เวอร์ชัน 3.11
# Define the minumun CMake version, as an example 3.24
cmake_minimum_required ( VERSION 3.24)
# Include the module
include (FetchContent)
# If using Qt6, override DEFAULT_MAJOR_VERSION
set (QT_DEFAULT_MAJOR_VERSION 6 CACHE STRING "Qt version to use, defaults to 6" )
# Set QAPPLICATION_CLASS
set (QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication" )
# Declare how is the source going to be obtained
FetchContent_Declare(
SingleApplication
GIT_REPOSITORY https://github.com/itay-grudev/SingleApplication
GIT_TAG master
#GIT_TAG e22a6bc235281152b0041ce39d4827b961b66ea6
)
# Fetch the repository and make it available to the build
FetchContent_MakeAvailable(SingleApplication)
# Then simply use find_package as usual
find_package (SingleApplication)
# Finally add it to the target_link_libraries() section
target_link_libraries (ClientePOS PRIVATE
Qt ${QT_VERSION_MAJOR} ::Widgets
Qt ${QT_VERSION_MAJOR} ::Network
Qt ${QT_VERSION_MAJOR} ::Sql
SingleApplication::SingleApplication
)
ไลบรารีตั้งค่า QLocalServer
และบล็อก QSharedMemory
อินสแตนซ์แรกของแอปพลิเคชันของคุณคืออินสแตนซ์หลักของคุณ มันจะตรวจสอบว่ามีบล็อกหน่วยความจำที่ใช้ร่วมกันอยู่หรือไม่ และถ้าไม่มีก็จะเริ่มต้น QLocalServer
และรับฟังการเชื่อมต่อ แต่ละอินสแตนซ์ที่ตามมาของแอปพลิเคชันของคุณจะตรวจสอบว่ามีบล็อกหน่วยความจำที่ใช้ร่วมกันอยู่หรือไม่ และหากมี บล็อกนั้นจะเชื่อมต่อกับ QLocalServer เพื่อแจ้งอินสแตนซ์หลักว่ามีการเริ่มต้นอินสแตนซ์ใหม่แล้ว หลังจากนั้นจะสิ้นสุดด้วยรหัสสถานะ 0
ใน Primary Instance SingleApplication
จะปล่อยสัญญาณ instanceStarted()
เมื่อตรวจพบว่ามีการเริ่มต้นอินสแตนซ์ใหม่แล้ว
ไลบรารีใช้ stdlib
เพื่อยุติโปรแกรมด้วยฟังก์ชัน exit()
นอกจากนี้อย่าลืมระบุคลาส QCoreApplication
ที่แอปของคุณใช้หากไม่ใช่ QCoreApplication
ดังตัวอย่างด้านบน
คลาส SingleApplication
ใช้สัญญาณ instanceStarted()
คุณสามารถเชื่อมโยงกับสัญญาณดังกล่าวเพื่อเพิ่มหน้าต่างแอปพลิเคชันของคุณเมื่อมีการเริ่มต้นอินสแตนซ์ใหม่ เป็นต้น
// window is a QWindow instance
QObject::connect (
&app,
&SingleApplication::instanceStarted,
&window,
&QWindow::raise
);
การใช้ SingleApplication::instance()
เป็นวิธีที่เรียบร้อยในการรับอินสแตนซ์ SingleApplication
เพื่อเชื่อมโยงกับสัญญาณทุกที่ในโปรแกรมของคุณ
หมายเหตุ: บน Windows ความสามารถในการนำหน้าต่างแอปพลิเคชันไปที่เบื้องหน้านั้นถูกจำกัด ดูการใช้งานเฉพาะของ Windows สำหรับวิธีแก้ปัญหาและตัวอย่างการใช้งาน
หากคุณต้องการเปิดใช้งานอินสแตนซ์รองเพิ่มเติม (ไม่เกี่ยวข้องกับอินสแตนซ์หลักของคุณ) คุณต้องเปิดใช้งานสิ่งนั้นด้วยพารามิเตอร์ตัวที่สามของตัวสร้าง SingleApplication
ค่าเริ่มต้นคือ false
หมายความว่าไม่มีอินสแตนซ์รอง นี่คือตัวอย่างวิธีที่คุณจะเริ่มต้นอินสแตนซ์รอง ส่งข้อความพร้อมอาร์กิวเมนต์บรรทัดคำสั่งไปยังอินสแตนซ์หลักแล้วปิดระบบ
int main ( int argc, char *argv[])
{
SingleApplication app ( argc, argv, true );
if ( app. isSecondary () ) {
app. sendMessage ( app. arguments (). join ( ' ' )). toUtf8 () );
app. exit ( 0 );
}
return app. exec ();
}
หมายเหตุ: อินสแตนซ์รองจะไม่ทำให้เกิดการปล่อยสัญญาณ instanceStarted()
ตามค่าเริ่มต้น ดู SingleApplication::Mode
สำหรับรายละเอียดเพิ่มเติม*
คุณสามารถตรวจสอบว่าอินสแตนซ์ของคุณเป็นอินสแตนซ์หลักหรือรองด้วยวิธีต่อไปนี้:
app.isPrimary();
// or
app.isSecondary();
หมายเหตุ: หากอินสแตนซ์หลักของคุณถูกยกเลิก อินสแตนซ์ที่เพิ่งเปิดตัวใหม่จะเข้ามาแทนที่อินสแตนซ์หลัก แม้ว่าจะตั้งค่าแฟล็กรองแล้วก็ตาม*
มีสามตัวอย่างที่ให้ไว้ในที่เก็บนี้:
examples/basic
examples/calculator
ของหน้าต่างหลักexamples/sending_arguments
แต่ละเวอร์ชันหลักจะนำเสนอการเปลี่ยนแปลงที่สำคัญมากหรือเข้ากันไม่ได้กับเวอร์ชันก่อนหน้า เวอร์ชันรองจะเพิ่มคุณสมบัติเพิ่มเติม การแก้ไขข้อบกพร่องหรือการปรับปรุงประสิทธิภาพเท่านั้น และเข้ากันได้กับเวอร์ชันก่อนหน้า ดู CHANGELOG.md สำหรับรายละเอียดเพิ่มเติม
ไลบรารีถูกใช้งานด้วยบล็อก QSharedMemory
ที่ปลอดภัยสำหรับเธรด และรับประกันว่าสภาวะการแข่งขันจะไม่เกิดขึ้น นอกจากนี้ยังใช้ QLocalSocket
เพื่อแจ้งกระบวนการหลักว่ามีการสร้างอินสแตนซ์ใหม่ และจึงเรียกใช้สัญญาณ instanceStarted()
และสำหรับการส่งข้อความไปยังอินสแตนซ์หลัก
นอกจากนี้ ไลบรารียังสามารถกู้คืนจากการถูกฆ่าโดยบังคับบนระบบ *nix และจะรีเซ็ตบล็อกหน่วยความจำ เนื่องจากไม่มีอินสแตนซ์อื่นทำงานอยู่
ไลบรารีนี้และเอกสารสนับสนุน ยกเว้นตัวอย่างเครื่องคิดเลข Qt ซึ่งเผยแพร่ภายใต้ใบอนุญาต BSD ได้รับการเผยแพร่ภายใต้เงื่อนไขของ The MIT License (MIT)
โดยมีเงื่อนไขเพิ่มเติมว่า:
Permission is not granted to use this software or any of the associated files
as sample data for the purposes of building machine learning models.