تحياتي أيها الزملاء!
منذ شهرين ، بدأت في النظر إلى Golang بهدف استخدامه لتطبيقات سطح المكتب. لقد أحببت اللغة والحجم وموضوع الحزم المكتوبة من أجلها ترك انطباعًا ، لكن الوضع مع واجهة المستخدم الرسومية ليس ورديًا جدًا. لن أتطرق إلى التفاصيل الآن ، يكفي أن أقول أنه بعد قراءة بعض المراجعات وإلقاء نظرة سريعة على حزم واجهة المستخدم الرسومية الحالية ، قررت كتابة تقريري الخاص ، خاصة وأن لدي خبرة في ذلك.
فكرتي الأولى كانت أن أذهب إلى المسار المعقد بالفعل: كتابة مجموعة من الوظائف المقابلة في C ، أو بالأحرى ، تكييف وظيفة جاهزة بالفعل - ما كتبته سابقًا لـ Harbour و C ++ ، وربطها باستخدام cgo (C API لـ Golang) و غلاف ودية. حتى أنني بدأت في القيام بذلك ، تلقيت النافذة الأولى ، ولكن كما كنت أتخيل مقدار العمل الذي لا يزال ينتظرنا ، بشكل منفصل لـ Windows ، بشكل منفصل لـ Linux ، عمل تقني بحت ، نظرًا لأنني مررت به بالفعل ، فإن حماسي قد برد إلى حد ما.
ثم جاءت فكرة أخرى.
بعد كل شيء ، لدي بالفعل مكتبة واجهة المستخدم الرسومية ، HwGUI لـ Harbour ، والتي تعمل بشكل جيد ، عبر الأنظمة الأساسية ، والتي أستخدمها بانتظام لتطبيقاتي. كل ما أحتاجه يتم تنفيذه بالفعل. لماذا لا تكتب على أساسها برنامج يعمل كنوع من خادم واجهة المستخدم الرسومية. بعد بدء تشغيل هذا الخادم ، سيستمع بصمت إلى منفذ معين ، وبعد تلقي اتصال من برنامج Golang الخاص بي ، سيقوم بإنشاء نوافذ ، وعناصر واجهة مستخدم استجابة لطلباته ، ومعالجتها وتقديم ملاحظات عند ظهور أي أحداث من الأدوات - في كلمة واحدة ، تنفيذ واجهة المستخدم الرسومية لذلك. جميع التفاصيل ذات المستوى المنخفض من تنفيذ واجهة المستخدم الرسومية موجودة بالفعل في المكتبة ، لنظام التشغيل Windows - من خلال المكالمات المباشرة إلى WinAPI ، و Linux / Unix ، وربما macOs - عبر GTK. بالإضافة إلى ذلك ، لا أعتزم إنشاء خادم بالمعنى الكامل للكلمة ، فلن يقبل اتصالات من برامج مختلفة - وهذا من شأنه إدخال صعوبات إضافية غير ضرورية. لكل مثيل من برنامج Golang ، سيتم إطلاق نسخة منفصلة من خادم واجهة المستخدم الرسومية ، الأمر الذي يبسط المهمة أكثر. بشكل عام ، سيتكون البرنامج من عمليتين ، إحداهما تؤدي المهمة الرئيسية ، والأخرى مسؤولة عن الواجهة.
يجب أن تتضمن الحزمة المقابلة لـ Go الإجراء Init ، الذي يبدأ خادم GUI وينضم إليه ، ومجموعة من الهياكل والأساليب والوظائف لإنشاء النوافذ والأدوات ومعالجتها. المحتوى الرئيسي لجميع هذه الوظائف هو إرسال رسائل بتنسيق معين (بناءً على JSON) إلى الخادم واستلام الرسائل منه. يتم دعم الاتصال باستخدام منفذي TCP / IP ، أحدهما مسؤول عن إرسال الطلبات إلى الخادم ، والآخر مسؤول عن استقبال الإشارات من الخادم لمعالجة الأحداث (الضغط على زر ، وإغلاق النافذة ، وما إلى ذلك). المهمة بسيطة نسبيًا ، الحزمة نفسها صغيرة. لا حاجة لاستخدام cgo ، لا حاجة للارتباط بمكتبات الجهات الخارجية ، كل التعليمات البرمجية في Go خالص. الملف التنفيذي للبرنامج نفسه والملف القابل للتنفيذ لخادم واجهة المستخدم الرسومية كلها.
يرجع اختيار Harbour + HwGUI لتنفيذ خادم GUI بالنسبة لي في المقام الأول إلى حقيقة أن هذه هي أدواتي "الأصلية" ، وهي أبسط وأسرع الحلول. لكن هذا اختيار جيد من وجهات النظر الأخرى. هنا ، في رأيي ، المزايا الرئيسية:
- عبر منصة "في الصندوق" ؛
- ما يسمى الشكل والأسلوب الأصلي ، نظرًا لأنه في نظام Windows ، يتم استدعاء WinAPI حصريًا ، تحت Linux / Unix - GTK ؛ إلى أي مدى لا أعرف GTK "الأصلي" لأجهزة macO ،
- القدرة على استخدام Harbour كلغة برمجة نصية مدمجة ، يمكن نقل أجزاء التعليمات البرمجية للتنفيذ إلى الخادم - معالجات الأحداث ، على سبيل المثال ، والتي يمكنها إلغاء تحميل البرنامج الرئيسي من بعض تفاصيل التنفيذ. بالإضافة إلى ذلك ، يعد Harbour جيدًا للعديد من الأشياء ، للعمل مع dbf وبعض قواعد البيانات ، على سبيل المثال ؛
- تنفيذ الطباعة ؛
- القدرة على استخدام نماذج الشاشة التي تم إنشاؤها بواسطة المصمم (أداة HwGUI). يتم تخزين هذه النماذج بتنسيق XML ويمكن استخدامها بدون تغييرات في أي نظام تشغيل يعمل عليه الخادم ؛
- القدرة على استخدام نماذج التقارير التي تم إنشاؤها بواسطة نفس المصمم للطباعة (أيضًا في XML).
باختصار ، لقد بدأت في القيام بذلك وتم بالفعل إنجاز جزء كبير من العمل. كلا المشروعين ، GuiServer وإطار Golang الخارجي GUI موجودان على Github ، جميع الروابط في نهاية المقال. فيما يلي زوج من لقطات الشاشة. لا شيء خاص ، مجرد اختبارات.
هذا مربع حوار بسيط:
ويتم ذلك بناءً على مثال من كتاب Kernigan و Donovan:
الآن الهدف الرئيسي من المشاريع هو ضمان أن هذا الزوجان اللطيفان ، الخارجية و GuiServer ، يمكن أن يفعلوا كل ما يمكن لـ HwGUI القيام به. حسنًا ، في عملية إنشاء بعض التطبيقات الحقيقية باستخدام الخارجية ، سيكون من الواضح ما هو مطلوب أكثر.
قد تكون هذه هي النهاية ، أجلت وصف حزمة جولانج لفترة أخرى. لكن الشيء الرئيسي في هذه المقالة بدأ للتو. بعد كل شيء ، يمكن استخدام الطريقة الموضحة لتنفيذ إطار عمل واجهة المستخدم الرسومية مع نفس خادم واجهة المستخدم الرسومية للغات أخرى. C ، Python ، Java ، ... ، حتى Perl و PHP (ولماذا لا؟) - راجع عنوان المقال. الحد الأدنى من التكاليف - وحل واجهة المستخدم الرسومية وظيفية إلى حد ما جاهز. إن أصعب شيء بالنسبة لكل لغة معينة ليس تنفيذ التبادل مع الخادم ، ولكن هذا الحل يناسب عضوًا في نموذجها ، في منطقها الداخلي. إذا كان أي شخص يريد إنشاء مثل هذا الإطار للغته ، فسأحاول تقديم كل المساعدة الممكنة في الحصول على المعلومات اللازمة ، وربما إضافة بعض الميزات إلى خادم واجهة المستخدم الرسومية.
بالتوازي مع حزمة Golang ، قمت بعمل تناظرية لـ Harbour ، بشكل أساسي لأغراض التحقق / التصحيح. من غير المحتمل أن أقوم بإطار عمل لـ Perl ، ولكن بالنسبة لـ C أو C ++ ، فمن المحتمل جدًا. وإليك السبب: بعد كل شيء ، هناك ميزة أخرى مثيرة للاهتمام تتعلق باستخدام خادم واجهة المستخدم الرسومية ، يمكن تشغيله على جهاز كمبيوتر آخر. يعمل البرنامج الرئيسي على كمبيوتر واحد ، وواجهة على كمبيوتر آخر. تظهر هنا فورًا خيارات لاستخدام هذه الحالة:
- يعمل البرنامج الرئيسي على خادم Linux / Unix الذي لم يتم تثبيت الغلاف الرسومي عليه على الإطلاق ؛
- يعمل البرنامج الرئيسي على جهاز كمبيوتر شخص آخر (مع وجود محاسب مشروط في شركتك) ، وأنت ، دون التدخل فيه ، تديره بنفسك ؛
- يعمل البرنامج الرئيسي على هاتف ذكي ، وأنت تحفر داخله من جهاز كمبيوتر عادي ؛
- يعمل البرنامج الرئيسي على وحدة التحكم ، على بعض أجهزة Arduino أو Raspberry أو نظيراتها ، حيث قد لا يكون هناك جهاز عرض عادي. تواصل مع جهاز الكمبيوتر المحمول - وانطلق.
حسنًا ، بالنسبة لهذا الخيار الأخير ، من المحتمل أن يكون إطار العمل C لخادم واجهة المستخدم الرسومية مفيدًا ، أعتقد أن هذا الاحتمال واعد جدًا.
وأخيرًا الروابط:
github.com/alkresin/guiserver - GuiServer على جيثب
github.com/alkresin/external - خارجي (حزمة Go) على Github
www.kresin.ru/guisrv.html - صفحة
GuiServer على موقعي ، يمكنك هنا تنزيل ثنائيات جاهزة
habr.com/post/198618 - مقالتي عن Harbour موجودة هنا في حبري
en.wikipedia.org/wiki/Harbor - ميناء على ويكيبيديا
www.kresin.ru/harbour.html - صفحة المرفأ على موقع الويب الخاص بي
www.kresin.ru/hwgui.html - صفحة HwGUI على موقع الويب الخاص بي
ملاحظة: من الواضح أن القليل من الناس سيقومون بتثبيت Harbour و HwGUI لبناء GuiServer من المصدر ، لذلك أقوم بنشر الثنائيات التي تم جمعها بانتظام على صفحة GuiServer على موقعي - لنظام التشغيل Windows ، Debian 8 32 بت ، Ubuntu 18.04 64 بت. يمكنني التجمع في فيدورا ، ولكن تحت نظام macOs - للأسف ، لا أملكها على مسافة قريبة.