-
تعداد ارسال ها
505 -
تاریخ عضویت
-
روز های برد
266
پست ها ارسال شده توسط کامبیز اسدزاده
-
-
در 11 ساعت قبل، Mohammad Rahbari Doust گفته است :سلام
من میخوام کتابخونه tz رو توی پروژه کیوت استفاده بکنم ولی لینک ارور میده .ظاهرا باید از cmake استفاده کرد اما بلد نیستم. منابع خوب و سریعی هم اگر دارید معرفی کنید . تشکر
سلام،
خطای لینکر مبنی بر این است که فایل ساخته شدهٔ کتابخانه قابل شناسایی نیست.
قبل از هر چیز دستورات زیر را به ترتیب برای کامپایل (ساخت) کتابخانهٔ tz اجرا کنید تا فایل
libtz.a
ساخته شود.mkdir build cd build cmake ../ cmake -DENABLE_DATE_TESTING=ON --build . make
در نهایت وارد یک پروژهٔ جدید بشید تا برای افزودن کتابخانه به صورت زیر عمل کنید:
-
فایل
libtz.a
را در یک پوشهای با نام lib و محتوای کتابخانه را در پوشهای با نام include در کنار پروژهٔ خودتان قرار دهید. - به دلیل اینکه این کتابخانه وابستهٔ کتابخانهٔ curl است، مطمئن شوید که آن نیز بر روی سیستم شما نصب باشد.
دستورات زیر را در سیمیک برای افزودن کتابخانهٔ libtz بنویسید.
add_library( date ${CMAKE_CURRENT_SOURCE_DIR}/include ) link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib) target_link_libraries(${PROJECT_NAME} PRIVATE tz)
احتمالاً خطایی برای عدم توانایی لینکسازی با curl دریافت کنید، در این صورت دستورات زیر را در سیمیک اضافه کنید:
FIND_PACKAGE(CURL) IF(CURL_FOUND) INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR}) SET(requiredlibs ${requiredlibs} ${CURL_LIBRARIES} ) ELSE(CURL_FOUND) MESSAGE(FATAL_ERROR "Could not find the CURL library and development files.") ENDIF(CURL_FOUND) target_link_libraries(${PROJECT_NAME} PRIVATE curl)
یک مثال از پروژهای که من libtz را همراه کیوت ادغام کردم:
cmake_minimum_required(VERSION 3.5) project(HelloCMake LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt5 COMPONENTS Widgets REQUIRED) FIND_PACKAGE(CURL) IF(CURL_FOUND) INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR}) SET(requiredlibs ${requiredlibs} ${CURL_LIBRARIES} ) ELSE(CURL_FOUND) MESSAGE(FATAL_ERROR "Could not find the CURL library and development files.") ENDIF(CURL_FOUND) add_library( date ${CMAKE_CURRENT_SOURCE_DIR}/include ) link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib) if(ANDROID) add_library(HelloCMake SHARED main.cpp mainwindow.cpp mainwindow.hpp mainwindow.ui ) else() add_executable(HelloCMake main.cpp mainwindow.cpp mainwindow.hpp mainwindow.ui ) endif() target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets) target_link_libraries(${PROJECT_NAME} PRIVATE tz) target_link_libraries(${PROJECT_NAME} PRIVATE curl)
بعد از این نباید در زمان کامپایل خطایی رُخ دهد. موفق باشید!
- 1
-
فایل
-
در 1 ساعت قبل، قاسم رمضانی منش گفته است :از مشخصهٔ
setStyleSheet
تحت CSS کار کن، مثال زیر رو ببین:QSlider::groove:horizontal { border: 1px solid #bbb; background: white; height: 10px; border-radius: 4px; } QSlider::sub-page:horizontal { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #66e, stop: 1 #bbf); background: qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1, stop: 0 #bbf, stop: 1 #55f); border: 1px solid #777; height: 10px; border-radius: 4px; } QSlider::add-page:horizontal { background: #fff; border: 1px solid #777; height: 10px; border-radius: 4px; } QSlider::handle:horizontal { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #eee, stop:1 #ccc); border: 1px solid #777; width: 13px; margin-top: -2px; margin-bottom: -2px; border-radius: 4px; } QSlider::handle:horizontal:hover { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #fff, stop:1 #ddd); border: 1px solid #444; border-radius: 4px; } QSlider::sub-page:horizontal:disabled { background: #bbb; border-color: #999; } QSlider::add-page:horizontal:disabled { background: #eee; border-color: #999; } QSlider::handle:horizontal:disabled { background: #eee; border: 1px solid #aaa; border-radius: 4px; }
البته ساختن چنین مواردی رو من در QML پیشنهاد میکنم.
-
در 6 دقیقه قبل، نیما غراب گفته است :دستتون درد نکنه خیلی ممنونم. این کدی که گفتین نتیجه عکسی میشه که پیوست کردم؟
مستطیل سبز یک Field هست که همزمان از دو نوع فونت برای نمایش متن استفاده شده فارسی بی نازنین هست و انگلیسیش تایمز نیو رومن.
من مشابه این کدی که گفتین رو نوشتم ولی فونت کل متن باهم تغییر میکنه!
خب فونت کل متن تغییر خواهد کرد! و این روش درستی هست. اما اگر میخواهید در بحث درونخط متنی که نوشتی یعنی «سلام بر World در زبان ++C» متن فارسی جدا و انگلیسی جدا تغییر کنند باید به فکر فونت فارسی باشی که داخلش از لاتینهای سفارشی استفاده میکنه. مثل صمیم، ساحل و یا فونتهای تجاری دیگر.
در این صورت هم نیاز نیست دو تا فونت معرفی کنی، همون یک مدل کافی هست، به شرطی که از فونت لاتین استفاده کند.
- 1
-
در 14 دقیقه قبل، نیما غراب گفته است :آقا کامبیز اگر بخوایم همزمان دو یا هر چند نوع فونتی که بخوایم رو در یک
TextField
یاTextInput
یا... داشته باشیم باید چه کنیم؟تغییر خاصیت
font.family
باعث میشه فونت کل متن باهم عوض شه در حالی که چیزی که مد نظر منه این هست که هرچی کارکتر فارسی هست فونتشون مثلا بی نازنین باشه و هرچی انگلیسی هست تایمز نیو رومن منتهی در یکTextField
یاTextInput
یا...الان با
locale
میشه تشخیص داد کارکتر وارد شده انگلیسی هست یا فارسی ولی نمیدونم چه طوری باید همزمان روی یک متن دو یا چند نوع فونت رو اعمال کرد!سپاس گزارم.
سادست، کافیه یک دستور شرطی ساده براش در نظر بگیری، مثل نمونهٔ زیر:
property bool isLatin : false .. ... .... Text { font.family: isLatin ? fontSystem.getEnglishFont.name : fontSystem.getPersianFont.name .. .... }
- 1
-
در 3 ساعت قبل، نیما غراب گفته است :سلام بر دوستان و اساتید گرامی.
پایه و اساس قیمت گذاری یک برنامه
C++
چگونه هست؟با سپاس فراوان.
پاسخ به این سوأل صرفاً از نظر نوع زبان کافی نیست و شاید منطقی نباشد. و چون ساختار و قوانین تحت چهارچوب مشخصی برای این موضوع نداریم، از نظر من دلایل بسیاری وجود دارد که بر روی قیمتگذاری میتواند تأثیرگذار باشد که به آنها اشاره میکنم:
-
تجربه و کیفیت خدماتِ قابل ارائهٔ فرد یا شرکت توسعهدهنده جهت انجام آن
- اینکه شخص یا شرکت مربوطه بتواند تضمین کند یا آسودگی خاطر را به مشتری بدهد که پروژهٔ آن در زمان مشخص با نتیجهٔ قابل قبول ارائه خواهد شد بسیار مهم است، قطعاً اطمینان خاطر و جلوگیری از احتمالات دوبارهکاری و نا رضایتی خودش ارزشمند خواهد بود که ممکن است در هزینهٔ نهایی پروژه موثر باشد.
-
تضامین و خدمات پس از فروش «پشتیبانی، بهروزرسانی و غیره»
- هرچند پشتیبانی و بهروزرسانی محصولات نرمافزاری یکی از مراحل توسعه و چرخهٔ نرمافزار است، اما در دسترس بودن و تضمین پشتیبانی از سمت توسعهدهنده قطعاً در هزینههای آن نسبت به دیگر موارد متفاوت خواهد بود.
-
نوع قرارداد و مذاکراتی که ممکن است طرفین در قبال تعهد به آنها هزینههایی را اضافه کند
- معمولاً در قراردادهای طرفین به نکاتی اشاره میشود، مانند: در دسترس بودن منبعکد «سورسکد» و یا مستند سازی غیر معمول و اختصاصی که حتماً در قیمت نهایی یک محصول و پروژه موثر خواهد بود.
-
محدودیتها و دلایل قانع کننده برای انتخاب یک ابزار و نیاز به دانش و مهارتهای تخصصی
- ممکن است پروژهای که به شما پیشنهاد میشود، با یک سری محدودیتهای فنی بر اساس نوع زبان، مهارت و بسترهای پیادهسازی مواجه باشد که با توجه به ارائهٔ راهکارهای مناسب توسط متخصص «توسعهدهنده» که واقعاً نیاز به تجربه و دانش در حل آن است وابسته خواهد بود. در چنین حالتهای ارزش حل مسائل میتواند در خود پروژه تأثیر بگذارد.
- در نهایت بعد از بررسی موارد این چنینی که من تنها به برخی از آنها اشاره کردم، میتوانید به خروجیها و نتایج حاصل از خود ابزار که در اینجا «++C» است اشاره کرده و مشتری را نسبت به آن قانع کنید. برای مثال، ویژگیِ چند-سکویی خود به تنهایی یک مزیت بسیار بزرگ است که میتواند در حذف هزینههای احتمالی مانند بازنویسی در زمان توسعه و بهروز رسانی در قالب سکوهای مختلف موثر باشد.
-
نوع مذاکره در ساخت و توسعه در قالب زمان مشخص
- برای سادهسازی مسئله و حل بایدها و نبایدها نیز مشخص سازی یک نرخ یا رنج قیمت برای کار بر روی پروژه میتواند موثر باشد. برای مثال، بر اساس تعداد ساعت و زمان مشخص در روز میتوانید یک محاسبهٔ مشخصی برای مشتری خود انتقال دهید تا هم زمان تحویل و هم مدت زمات مورد نیاز برای توسعه را بداند.
دربارهٔ همین موضوع چند-سکویی که تنها یک ویژگی از مزایای سیپلاسپلاس است مثالی بزنم:
فرض کنید قرار است مشتری یک نرمافزار تحت موبایل از شما درخواست کند، در این صورت اگر قرار باشد منطقی مذاکره کنید، بهتر است مشتری را متوجه این سازید که برای ساخت یک اپلیکیشن در سکوهای مختلف مانند iOS، Android و غیره نیاز به تخصص، زمان و هزینههای جدا از هم است. اما اگر شما به عنوانی توسعهدهندهٔ تمام عیار فولاِستک هستید، میتوانید مشتری را قانع کنید که صرفاً با یکپارچهسازی کدهای توسعه و ساختار بهینهٔ برنامههای نوشته شدهٔ تحت سی++ از صرف هزینههای احتمالی جهت توسعه جلوگیری میکنید و حتی در آینده نیازی نیست هزینههای اضافه بر مشتری تحمیل کنید. در این رابطه باید به یک هزینهٔ قابل قبول همراه با حفظ ارزشهای وارده را مطرح کنید.
برای مثال، اگر قرار است یک اپلیکیشن برای دو پلتفرم مختلف توسعه یابد، اگر قیمتی بابت یک نرمافزار در دو سکوی مختلف استعلام و یا تخمین زده شده باشد، بهتر است شما با در نظر گرفتن نصف و یا حداکثر دو سوم آن همان کارها را با حفظ ارزشهای فنی و کاربری مشتری انجام دهید. بر اساس چنین مواردی نیازی به افزایش یا کاهش هزینهها در یک پلتفرم وجود ندارد چرا که تنها کاری که انجام خواهید داد همگردانی «کامپایل» کدها بر روی پلتفرم دیگر خواهد بود.
- 2
- 1
-
تجربه و کیفیت خدماتِ قابل ارائهٔ فرد یا شرکت توسعهدهنده جهت انجام آن
-
در 7 ساعت قبل، نیما غراب گفته است :@کامبیز اسدزاده دستتون درد نکنه خیلی ممنونم.
خب مشکل من الان همین isLatin هست که نمیدونم چه طوری باید در زمان اجرا با توجه به اینکه کاربر، کیبوردش رو روی چی گذاشته باشه تغییرش بدم!
رویدادی یا سیگنالی برای اینکار وجود نداره که مثلا هروقت کاربر زبان تایپ رو عوض کرد بشه ازش مطلع شد و نوعشم فهمید؟
سمت سیپلاسپلاس کدی تدارک ببینید که وضعیت لایهٔ زبانی روی صفحهکلید رو بررسی و به سمت کیوامال پاس بده.
در آخرین تغییراتِ کیوت، از کدی مشابه زیر میتونید استفاده و روش مورد نظر خودتون رو پیاده کنید:
QGuiApplication app(argc, argv); QLocale locale; app.inputMethod()->locale().setDefault(QLocale::English); qDebug() << app.inputMethod()->locale().language();
مقداری که چاپ میشه رو در یک روش بهتر در قالب کلاس و تابعی مشتق شده از
QObject
به سمت QML پاس بدین.- 1
-
در 4 دقیقه قبل، نیما غراب گفته است :سلام بر دوستان گرامی و اساتید ارجمند.
چه طوری در QML/Qt Quick میشه در یک TextArea یا دیگر اشیا مرتبط با تایپ متن، جوری تعریف شن تا وقتی کیبورد روی فارسی هست از فونت مثلا بینازنین استفاده شه برای تایپ و وقتی کیبورد به زبان انگلیسی تغییر پیدا کرد از فونت مثلا تایمز نیو رومن استفاده شه؟ آیا اصلا QML یک همچین مکانیزمی رو در اختیار ما در سمت رابط کاربری قرار میده یا باید از خود C++ کمک گرفت؟
سپاس گزارم.
درود،
دو تا سیستم فونت تعریف کنید، یکیش لاتین برای انگلیسی و دیگری فونت مورد نظر برای فارسی. برای مثال، همچین چیزی رو در نظر داشته باشید:FontLoader { id: fontEnglish source: "english-font.ttf" } FontLoader { id: fontPersian source: "persian-font.ttf" }
در نهایت در یک دستور شرطی با توجه به واکنش بر اساس مشخصهٔ فکوس و یا هر چیزی که نیاز هست فونتها رو اعمال کنید. برای مثال به صورت زیر:
TextField { //Todo... property bool isLatin : false font.family: isLatin ? fontEnglish.name : fontPersian.name onPlaceholderTextChanged: { //ToDo... } }
- 1
-
در 21 ساعت قبل، amirb گفته است :با سلام.
از آن جایی که در پنل کافه بازار فقط یک فایل apk که با همه ی معماری های پردازنده سازگار است می توان منتشر کرد با qt 5.12 چطور خروجی باید بگیریم که توسط همه ی پردازنده ها پشتیبانی بشه؟
در نسخهٔ ۵.۱۲ نمیتونید پشتیبانی از همهٔ معماریها رو در یک فایل ارائه کنید. برای پشتیبانی کامل اپلیکیشن شما از این قابلیت بهتره اون رو در قالب
aab
منتشرش کنید. در کیوت ۵.۱۳ این امکان هم وجود داره، در بخش تنظیمات زبانهٔ Advanced Action گزینهٔBuild .aab (Android App Bounlde)
رو تیک بزنید. -
در در 30 آذر 1398 در 00:50، amirb گفته است :با توجه به روشی که توضیح دادید چکار کنیم که کتابخانه ی از نوع shared داخل خروجی امبد بشه؟(برای لینوکس و اندروید)
روشی که توضیح داده شده بود به همین مدل اشاره داشت.
باید توجه داشته باشید که فایلهایی با پسوند.a
برای کتابخانههای ایستا و.so
برای نوع داینامیک یا همون Shared هستند. البته باید توجه کنید حتماً روی کیت اندروید و لینوکس کتابخانههای مربوطه را کامپایل و به پروژه اضافه کنید. -
در ۱ ساعت قبل، moohin گفته است :خب چطور باید پیدا کنم برنامه هایی کوچیکی که برای شروع مناسبه از توی گیت هاب ؟
از تکنیک جستجو در گوگل استفاده کنید.
برای مثال عنوان برنامه + Github
نتایجی که به دست میاد رو بررسی کنید. یا اینکه عنوان برنامهٔ مورد نظرتون رو در داخل گیتهاب جستجو کنید.
- 1
-
در 41 دقیقه قبل، amirb گفته است :سلام.خسته نباشید.
می خوام از این کتابخانه در qt استفاده کنم و خروجی اندروید بگیرم.سیستمی هم که باهاش برنامه نویسی می کنم لینوکسی هست.باید نسخه ی اندرویدی این کتابخانه را بگیرم یا لینوکسی رو؟
شما باید نسخهٔ اندروید رو دریافت کنید که مختصِ بستر اندروید ساخته شده است.
در 41 دقیقه قبل، amirb گفته است :چجوری داخل پروژم اضافه کنم؟
برای اضافه کردن به پروژه هم به همین روشی که قبلاً توضیح داده شده ازش استفاده کنید.
اگر مشکلی بود خطا و جزئیات رو بنویسید تا بررسی شود.
-
در 3 ساعت قبل، moohin گفته است :سلام
میخواستم بدون کجا میشه پروژه ها و برنامه هایی در ابعاد کوچیک و آزاد رو پیدا کرد و سورسشونو دید و ازشون یادگرفت؟
بیشتر چون ایده ای برای برنامه نویسی توی ذهنم نیست دنبال این هستم برنامه های نوشته شده توسط افراد دیگه رو ببینم و یاد بگیرم که چطوری این کارو میکنن بعد از یادگیری قواعد برنامه نویسی .
با تشکر
درود،
از Github استفاده کنید.- 1
-
در کتابخانهٔ SFML کلاس Http این امکان را فراهم میکند تا به راحتی بتوانید تحت روشهای Post، Get و Head درخواستهای مورد نظر را دریافت و ارسال کنید. توجه داشته باشید این کتابخانه تنها از مباحث ابتدائی پروتکل Http پشتیبانی میکند.
برای دسترسی و استفاده از این ویژگی کافی است سرآیند زیر را وارد کنید:
#include <SFML/Network.hpp>
سپس با فراخوانی فضای نام به صورت زیر، از کلاس مربوطه یک نمونه خواهیم ساخت:
sf::Http http;
به عنوان مثال کد زیر جهت آماده سازی برای ارسال به سمت سرور کافی است:
#include <SFML/Network.hpp> sf::Http http; http.setHost("http://www.iostream.ir/");
با توجه به نیازهای مربوط به این مبحث، ارسال مقادیر به یک صفحه و آدرس اینترنتی توسط Request و Response صورت میگیرد که جهت دسترسی به این ویژگیها کافی است از کلاس مربوطه به صورت زیر نمونه گرفته شود.
sf::Http::Request request; request.setMethod(sf::Http::Request::Post); request.setUri("/page.html"); request.setHttpVersion(1, 1); // HTTP 1.1 request.setField("From", "me"); request.setField("Content-Type", "application/x-www-form-urlencoded"); request.setBody("para1=value1¶m2=value2"); sf::Http::Response response = http.sendRequest(request);
در کد فوق، روش درخواست از نوع Post و یا Get مشخص میشود که از متد
setMethod
جهت اعمال آن استفاده شده است. در ادامه مشخصهٔsetUri
صفحه و یاآدرسی را که قرار است اطلاعات به آن ارسال یا دریافت شود را مشخص میکند. نسخهٔ پروتکل http با مشخصهٔsetHttpVersion
با مقادیر صحیح مقدار دهی میشود که در این مثال مقدار ۱ به عنوان پشتیبانی از پروتکل نسخهٔ Http 1.1 تعیین شده است.با توجه به ماهیت روش Post مقادیری که برای ارسال نیاز است را باید ارسال کنید، برخی از اطلاعات ارسالی مانند
Content-Type
و غیره توسط مشخصهٔsetField
مشخص میشود و همچنین مشخصهٔsetBody
پارامترها (ورودیهایی) که از طرف کاربر ارسال میشود را فراهم میکند.در نهایت کلاس Response جهت دریافت و مدیریت دادههای ارسالی از سمت سرور را مدیریت میکند که برای دسترسی و چاپ اطلاعات تحت آن به صورت زیر خواهد بود:
sf::Http::Response response = http.sendRequest(request); std::cout << "status: " << response.getStatus() << std::endl; std::cout << "HTTP version: " << response.getMajorHttpVersion() << "." << response.getMinorHttpVersion() << std::endl; std::cout << "Content-Type header:" << response.getField("Content-Type") << std::endl; std::cout << "body: " << response.getBody() << std::endl;
مثال فوق وضعیت، نسخهٔ مرتبط با پروتکل مربوطه، مقدار Content-Type و همچنین اطلاعات ارسال شده در مشخصهٔ body را چاپ خواهد کرد.
در ادامه مثال مشخصی را برای ارسال یک نظر را آوردهایم که به صورت زیر خواهد بود:
#include <SFML/Network.hpp> #include <sstream> void sendComment(const std::string &message, const std::string &username) { // Prepare the request sf::Http::Request request("/comment.php", sf::Http::Request::Post); // Encode the parameters in the request body std::ostringstream stream; stream << "username=" << username << "&message=" << score; request.setBody(stream.str()); // Send the request sf::Http http("http://www.iostream.ir/"); sf::Http::Response response = http.sendRequest(request); // Check the status if (response.getStatus() == sf::Http::Response::Ok) { // Check the contents of the response std::cout << response.getBody() << std::endl; } else { std::cout << "Request failed" << std::endl; } }
توجه داشته باشید که جهت بررسی وضعیت ارسالی از نمونهٔ
response
متدgetStatus
را میتوان با شمارندههای موجود در کلاس Response مورد ارزیابی قرار داد.در نهایت در سمت سرور کد زیر میتواند مقادیر ارسال شده را دریافت و پاسخ دهد:
<?php $username = $_POST['username']; $message = $_POST['message']; if (write_to_database($username, $message)) { echo "Your comment has been added!"; } else { echo "failed to write your message to database..."; } ?>
نکته: مثالهای فوق صرفاً برای آشنایی با نحوهٔ استفاده از ویژگی مربوطه در این کتابخانه است، بنابراین بسیار ساده و فاقد کدهای امنیتی و سفارشی است.
-
سلام و درود،
مدتی است از سرویسهای کاوهنگار جهت استفاده در پروژههای خودم استفاده میکنم و مطمئنم یکی از بهترین سرویسدهندههای ایرانی در زمینهٔ پیام کوتاه است. متأسفانه همانطور که میدانید بسیاری از سرویسدهندهها در ایران به خاطر عدم شناخت دقیق از اهمیت و کاربرد سی++ هیچ حرکتی در توسعهٔ سرویسهای خود در رابطه با سی++ را نمیکنند. بنابراین، جدیداً تصمیم گرفتم کیتهای توسعه در قالب رابطهای برنامهنویسی مورد نیاز رو برای این چنین شرکت و سرویسها آن ارائه کنم.
معرفی سرویس پیام کوتاه کاوهنگار
کاوه نگار با ارائه وبسرویس پیامک و تماس صوتی پیشرفته برای توسعه دهندگان ،امکان ارسال و دریافت پیامک و برقراری تماس اینترنتی را در اغلب سرویس های نرم افزاری مهیا می کند.
اهمیت وجود این سرویس در زبانهایی مانند C و ++C
همانطور که میدانید با توجه به اهمیت این زبانها و به خصوص پشتیبانی از کتابخانههای بسیار مدرن در توسعهٔ اپلیکیشنها و وبها کاربرد بسیاری دارند که شاید در کشور ما آنچنان با آنها آشنا نیستیم. بنابراین وجود سرویسهای ارسال پیامک در قالب زبان سیپلاسپلاس میتواند کمک بسیار بزرگی به توسعهدهندگان و علاقهمندان آن در حوزههای توسعهٔ نرمافزار و انواع برنامههای موبایل و وب کمک کند.
ساختار اولیه خروجی سرویس کاوهنگار به صورت زیر است:
{ "return": { "status":404, "message":"متد تعریف نشده است" }, "entries": { null } }
در صورتی که مقادیر ارسالی صحیح و مطابق با اطلاعات کاربری موجود در کاوهنگار باشد نتیجهٔ برگشتی آن به صورت زیر خواهد بود:
{ "return": { "status": 200, "message": "تایید شد" }, "entries": [ { "messageid": 8792343, "message": "خدمات پیام کوتاه کاوه نگار", "status": 1, "statustext": "در صف ارسال", "sender": "10004346", "receptor": "0914XXXXXXX", "date": 1356619709, "cost": 120 } ] }
نمونهٔ اولیه که توسعه داده شده، با مفهوم اولیه جهت ارسال پیام کوتاه بر اساس کلید و شمارههای ارسالی آماده شده که کد نمونهٔ آن به صورت زیر خواهد بود.
#include <iostream> #include <Kavenegar> int main() { //! Your Api Key std::string apiKey {"Your Api-Key"}; //! Kavenegar Default Sender Number std::string senderLine {"10004346"}; Kavenegar::KavenegarApi api(MethodType ,"10004346",apiKey); //ToDo.. try catch exception handling. api.send("09140000000","Hi!"); std::cout << "Result : " << api.getResult(); //JSon Output return 0; }
نکته: نمونهٔ ساخته شده کامل و با تمام جزئیات موجود در کاوهنگار تکمیل و توسعه داده خواهد شد.
لینک مربوط به کیت توسعه در گیتهاب.
جهت استفاده از این نمونه توجه داشته باشید که جهت اجرای وبسرویس آن نیاز به نصب Curl و RapidJson خواهید داشت.
- 1
-
با سلام و درود،
همانطور که میدانید ویژگیهای اخیر در استانداردهای ۱۷ و ۲۰ بسیار عظیم و کاربردی هستند. هدف ما در مرجع آیاواستریم این است که با توجه به بهروزرسانیهای زبان سیپلاسپلاس مهمترین مواردی که نیاز است معرفی کنیم.
بنابراین در این بخش به یکی از کاربردیترین موارد مرتبط در استاندارد ۱۷ با عنوان صفتهای ویژه اشاره میشود که در ادامه به تعریف هر یک از آنها میپردازیم.
با توجه به استانداردهای ۱۱ و ۱۴ که در آن صفتهایی همچون
[[deprecated]]
و[[noreturn]]
معرفی شدهاند که وظیفهٔ آن به ترتیب نمایش وضعیت منسوخ شدن یک عملکرد و یا وضعیت بازگشتی یک تابع از نوعvoid
است. چنین صفاتی میتوانند در زمان اعلان و تعریف متغیرها و یا توابع مورد استفاده قرار گیرند. به عنوان مثال اگر کدی به صورت زیر داشته باشیم:[[deprecated]] void print(const std::string &message) { std::cout << message << std::endl; }
در صورتی که تابع
print
در بخشی از برنامه مورد استفاده قرار بگیرد، پیغامی از سمت کامپایلر از نوع اخطار (warning) ساطع میشود، مبنی بر آن که تابع مربوطه به عنوان منسوخ شده یاد شده است.warning: 'print' is deprecated
این ویژگی میتواند در ساخت و توسعهٔ کتابخانهها، موتورها، چهارچوب (فریمورک) و برنامههایی که قرار است دیگر برنامهنویسان از آنها استفاده کنند بسیار میتواند کاربردی باشد؛ چرا که با اعمال چنین خاصیتهایی در کدهای شما برای توسعهدهندگان یادآوری خواهد شد که کد مربوطه در نسخهٔ جدید یا نسخههای بعدی امکان حذف و یا تغییر را خواهد داشت.
#include <iostream> #include <string> [[deprecated]] void print(const std::string &message) { std::cout << message << std::endl; } int main() { print("Hello, World!"); return 0; }
در مثال بالا اخطار پیشفرض از سمت کامپایلر ساطع میشود، اما در بعضی از مواقع لازم است پیغام سفارشی جهت راهنمایی بیشتر کاربر اعمال شود که در این صورت صفت میتواند پیغام از نوع رشته را دریافت و در هنگام ساطع شدن، آن را نمایش دهد. برای این کار کافی است متن مورد نظر را به صورت زیر در صفت خود تعیین کنیم.
[[deprecated("Use printView with print instead, this function will be removed in the next release")]]
برای مثال یک تابع جایگزین و بهینه شده را به صورت زیر در نظر بگیرید، کامپالر اخطار مروبطه و سفارشی شده را نسبت به آن ساطع خواهد کرد.
#include <iostream> #include <string> [[deprecated]] void print(const std::string &message) { std::cout << message << std::endl; } void printView(std::string_view message) { std::cout << message << std::endl; } int main() { printView("Hello, World!"); return 0; }
همچنین در رابطه با صفت
[[noreturn]]
که در استاندارد ۱۱ معرفی شده است، باید در نظر داشت این صفت جهت بهینهسازی کامپایلر در رابطه با تولید هشدارهای بهتر و همچنین اعلام اینکه تابع مربوطه قابل دسترسی نیست مورد استفاده قرار میگیرد.مثال:
#include <iostream> [[noreturn]] void myFunction() { std::cout << "Hello, World!" << std::endl; throw "error"; } void print() { std::cout << "Print Now!"; } int main() { myFunction(); print(); return 0; }
در کد فوق، در زمان همگردانی (کامپایل) پیغام زیر ساطع میشود:
warning: code will never be executed
بنابراین در زمان اجرا تابع
print();
اجرا نخواهد شد، زیرا به عنوان یک کد غیر قابل دسترس بعد ازmyFunction
توسط کامپایلر یاد میشود. چرا که این امر اجازه میدهد تا کامپایلر بهینهسازیهای مختلفی را انجام دهد - نیازی به ذخیرهسازی و بازیابی هرگونه حالتهای ناپایدار در اطراف صدا زننده (Caller) نیست. بنابراین میتواند کدهای غیر قابل دسترس را از بین ببرد.با توجه به نیازهای این چنینی، در استاندارد ۱۷ صفتهای جدیدتر و کاربردیتری نیز ارائه شده است که به معرفی هر یک از آنها در بخش اول از این مقاله میپردازیم.
صفتهای معرفی شده در استاندارد 1z یا همان ۱۷ به صورت زیر هستند:
- [[fallthrough]]
- [[maybe_unused]]
- [[nodiscard]]
معرفی صفت [[fallthrough]]
به طور معمول در برنامهنویسی، هر وقت که مرحلهٔ مربوط به
case
در دستورswitch
به انتهای خود میرسد، کد مربوطِ به دستورِcase
بعدی اجرا خواهد شد. طبیعتاً عبارتbreak
میتواند از این امر جلوگیری کند. اما از آنجایی که این رفتار را به اصطلاح fall-through میشناسیم، ممکن است در صورت عدم معرفی اشکالاتی را فراهم کند، در این حالت چندین کامپایلر و ابزارهای آنالیز کننده خطای مرتبط به آن را هشدار میدهند تا کاربر در جریان قرار بگیرد.با توجه به این موضوع که ممکن است بعضاً این مورد چشم پوشی شود، در سیپلاسپلاس ۱۷ به بعد یک صفت استاندارد معرفی شد تا توسعهدهنده بتواند با قرار دادن آن در مکان سقوط (fall-through) به کامپایلر اعلام کند که هشداری در آن بخش لازم نیست.
کامپایلرها میتوانند هشدارهای مطمئنی را در زمانی که یک عبارت
case
بدون اجرای دستورbreak
به انتهای خود میرسند و یا سقوط (fall-through) میکند، حداقل با یک جملهٔ مربوطِ به آن را ساطع کند.برای مثال به کد زیر توجه کنید:
#include <iostream> int main() { int number { 2017 }; int standard = {0}; switch(number) { case 2011: case 2014: case 2017: std::cout << "Using modern C++" << std::endl; case 1998: case 2003: standard = number; } return 0; }
در کد فوق، در زمان اجرای دستور case سوم با مقدار ۲۰۱۷، کامپایلر هشداری به صورت زیر را اعمال خواهد کرد.
warning: unannotated fall-through between switch labels
در این حالت برای از بین بردن (چشمپوشی کردن) از این خطا در صورتی که نیاز نباشد موارد دیگر مورد بررسی قرار بگیرد قرار دادن دستور break بعد از آن میتواند منطقی باشد. اما با توجه به انتظاری که میرود تا دستورات بدون توقف بین آنها اجرا شود، قراردادن دستور
[[fallthrough]];
بعد از آن میتواند راه حل بسیار مناسبی باشد.#include <iostream> int main() { int number { 2017 }; int standard = {0}; switch(number) { case 2011: case 2014: case 2017: std::cout << "Using modern C++" << std::endl; [[fallthrough]]; // > No warning case 1998: case 2003: standard = number; } return 0; }
در این حالت، کامپایلر بدون ساطع کردن خطا آن را همگردانی خواهد کرد.
معرفی صفت [[maybe_unused]]
صفت
[[maybe_unused]]
برای نشان دادن کد ایجاد شدهای است که ممکن است از منطق قطعی استفاده نکند. این مورد ممکن است اغلب در لینک شدن با پیشپردازندهها مورد استفاده قرار بگیرد یا نگیرد. از آنجایی که کامپایلر (همگردانها) میتوانند نسبت به متغیرهای بلا استفاده هشدار ساطع کنند، این صفت روش بسیار خوبی برای سرکوب آنها خواهد بود.استفاده از این ویژگی میتواند در بخشهای مهمی مفید باشد، فرض کنید کتابخانهای نوشتهایم که قرار است به صورت چند-سکویی دارای ویژگیهای یکسان در بسترهای مختلف باشد. برای مثال ساخت یک فایل در مسیر مشخصی از سیستمعامل مورد نظر جهت اعمال تنظیمات نرمافزار.
namespace FileSystem::Configuration { [[maybe_unused]] std::string createWindowsConfigFilePath(const std::string &relativePath); [[maybe_unused]] std::string createMacOSConfigFilePath(const std::string &relativePath); [[maybe_unused]] std::string createLinuxConfigFilePath(const std::string &relativePath); [[maybe_unused]] std::string createiOSConfigFilePath(const std::string &relativePath); [[maybe_unused]] std::string createAndroidConfigFilePath(const std::string &relativePath); }
به کد بالا توجه کنید، در صورتی که شما در محیط کدنویسی در حال استفاده از یک دستور مورد نظر از بین دستورات بالا هستید، طبیعتاً کامپایلر به بقیهٔ دستوراتی که از آنها استفاده نمیکنید پیغامی مبنی بر آن که دستور مربوطه بلااستفاده مانده است را ساطع میکند.
جهت جلوگیری از این هشدارها کافی است صفت
[[maybe_unused]]
را قبل از آنها اعمال کنید.معرفی صفت [[nodiscard]]
در صورتی که از
[[nodiscard]]
استفاده شود، کامپایلر میتواند درک کند توابعی که مقدار بازگشتی دارند نمیتوانند مقدار بازگشت داده شدهٔ آنها را دور انداخت و یا از آنها در زمان صدا زدن صرف نظر کرد. بنابراین با تعریف این صفت در توابع از نوع بازگشتی میتوان پیغامی به صورت زیر را ساطع کند.مثال:
#include <iostream> [[nodiscard]] int myFunction() { return 17; } int main() { myFunction(); return 0; }
در مثال فوق تابع
myFunction
در زمان فراخوانی که مقدار بازگشتی آن بی نتیجه مانده است از سمت کامپایلر هشدار مورد نظر را دریافت خواهد کرد. این پیغام در صورتی که مقدار بازگشتی تابع به متغیری از هم نوعِ خودش ارسال شود، ساطع نخواهد شد.#include <iostream> [[nodiscard]] int myFunction() { return 17; } int main() { int func; func = myFunction(); return 0; }
- 2
- 1
- 5
-
در 21 ساعت قبل، mahdikhi گفته است :سلام
صرفا از این جهت این سوال را میپرسم که خب تا اینجای مطلبی که نوشتین برای بسیاری از افراد، همان طور خودتون گفتین دیوانگی بنظر میرسه پس چرا یکم این دیوانگی بیشتر نباشه؟.
سلام،
منظور از دیوانگی این هست که اکثراً در دنیای وِب با وجود زبانهایی مثل php و غیره اینطور در نظر داشته باشند که خب مگه میشه با سی++ چنین برنامههایی رو هم طراحی کرد؟ خب این برمیگرده به اطلاعات کمی که داریم! برای مثال ما از ابتدای شروع یادگیری سی++ اینطور فکر میکنیم که سی++ فقط یک زبان دانشگاهی برای پاس کردن چهارتا نمرهٔ درسی هست!
برای اینکه حقایق پنهان این زبان رو بشناسیم این پست رو قبلاً آماده کردم.
برای مثال کافیه یک تحقیق صورت بگیره که سایتهای بزرگی مثل فیسبوک، آمازون، گوگل و غیره اساسشون با سی++ هست. این کار منطقی و دلایل خودش رو داره (
در 21 ساعت قبل، mahdikhi گفته است :یعنی یک سیستم کاملا سی++ رو بشه برای برنامه نویسی تحت وب پیاده کرد؟
جاوا اسکریپت همیشه به عنوان یک ابزار خوب در سمت فرانتاند مطرح هست. منظور از سی++ این نیست که فرانتش رو هم با سی++ بنویسیم! طبیعتاً شما وقتی با Php یا موارد دیگر وبسایتی رو طراحی میکنید بخش فرانت و بکاندش رو جدا از هم ترکیب خواهید کرد.
در این روش هم سمت رابطکاربری با HTML5, CSS3, JavaScript, Angular.JS و غیره امکان پذیر است. تمامی کدهای منطقی سمت سی++ نوشته میشه که طبیعتاً نسبت به دیگر زبانها مزایا و کیفیت خودش رو داره.
در 21 ساعت قبل، mahdikhi گفته است :یعنی یک سیستم کاملا سی++ رو بشه برای برنامه نویسی تحت وب پیاده کرد؟
بستگی داره منظورتون از سیستم کامل چی باشه!
برای مثال یک وبسرور رو کامل میشه پیاده سازی کرد! اما طبیعتاً یک وبسایتی که شامل یک ظاهر از طراحی قالب شیک و یا گزینههای سمت کاربری هست (این دیوانگیه که با سی++ پیادش کنی) چون JS و HTML برای این کار ساخته شده! بنابراین شما میتونی با سی++ بکاند وب رو توسعه بدی و بقیه موارد رو با فناوریهای مرتبط با خودش.
در 21 ساعت قبل، mahdikhi گفته است :حتما ازاین که مثلا نودجی.اس هم بسیار سرعت خوبی داره و سروصدای خوبی هم به پا کرده که جاوااسکریپت در دوسمت برنامه نویسی وب وارد شده و سریعت بخشیده و.... هم زیاد شنیدین، ولی خب در بحث سرعت هنوز سی و سی++ رو نمیتونن رد کنن.
مشتاق خوندن پستهای بعدی تون هستم.
نودجیاِس ذاتاً در جاهایی که کم میاره با سی++ قابل توسعه هست. اما خب وقتی شما میتونی با سی++ مستقیم وارد بحث توسعهٔ وب بشی دیگه نگرانی کارایی نخواهی دات. البته اشاره کنم ماهیت سرعت در برنامههای تحت وب ذاتاً فقط بحث زبان نیست! برای مثال بحثهای چندنخی، پردازشهای موازی و غیره همه مهم هستند. حتی ممکنه شما با سی++ بهترین کد و سریعترین نوعِش رو بنویسی اما با وجود یک کد خیلی ساده اما بد در سمت JS یا HTML از کارایی برنامه به شدت بکاهی!
در 21 ساعت قبل، mahdikhi گفته است :مشتاق خوندن پستهای بعدی تون هستم.
این مقاله صرفاً یک مقالهٔ آزمایشی بود، در مورد فریمورکهای قدرتمند سی++ به زودی به معرفی انواع آنها و روشهای توسعهٔ وب اشاره خواهد شد که طبیعتاً میتوان به این نتیجه رسید که نه تنها دیوانگی نیست، بلکه ما با یک روند توسعه و فناوریهای جدیدی مواجه هستیم.
- 1
-
در 4 ساعت قبل، سید محمد عباسی گفته است :ممنونیم، مهندسجان.
خواهش میشود.
-
در 8 ساعت قبل، سید محمد عباسی گفته است :سلام، اینکه کنترلوشون کرد، یعنی با استفاده از این کلمات کلیدی، میشه محدودشون کرد؟ که کدوم وارد بشن و کدوم وارد نشن، درسته؟
منظور محدود کردن نیست، در واقع شما عمل تأیید یا امضاء برای یک شیء را جهت استفاده در یک کتابخانه یا برنامهٔ دیگر اعمال میکنید. این واژهٔ کلیدی به شما اجازه میدهد اطلاعات کلاس ذخیره شده را در مراحل کامپایل به لینکر مشخص کنید، با توجه به مثال مربوطه استفاده از این دستور اساساً با توجه به صِفتِ
dllexport
به لینکر میگوید که شیء مورد نظر برای استفاده صادر میشود که توسط سایر کتابخانهها (DLL) یا برنامهها قابل استفاده خواهد بود. در این حالت تعاریف مربوط به اعلانهای موجود باید در برنامهٔ مشابه پیاده سازی شود، در غیر اینصورت خطای لینکر ساطع میشود. زمانی از این روش استفاده میشود که بخواهید DLL ای را ساخته و دیگر موارد را به آن لینک (پیوند) کنید.در صورتی که صفت
dllimport
مشخص شود عمل عکسِ آن صورت میگیرد؛ پیادهسازیهای (implementation) مربوطه به آن برای استفاده در برنامهٔ شما وارد میشوند. استفاده از dllimport نیز یک گزینهٔ اختیاری است. در صورت استفاده از این کلیدواژه، کامپایلر کد کارآمدتری را تولید میکند. با این حال بهتر است شما برای دسترسی به نمادها و اشیاء دادههای عمومی از آن استفاده کنید.به مثالهای زیر توجه کنید:
__declspec(dllexport) void messageBox (std::string_view msg);
__declspec(dllimport) void messageBox (std::string_view msg);
معمولاً پیشنهاد میشود برای داشتن یک API خوب به صورت زیر پیاده سازی شود.
#ifdef LIBRARY_API #define LIBRARY_API __declspec(dllexport) #else #define LIBRARY_API __declspec(dllimport) #endif
نمونه مثال از فایل سرآیند:
#ifndef MESSAGELIB_HPP #define MESSAGELIB_HPP #pragma once #include <iostream> #include <string_view> #include <string> #ifdef LIBRARY_API #define LIBRARY_API __declspec(dllexport) #else #define LIBRARY_API __declspec(dllimport) #endif class LIBRARY_API MessageBox { public: MessageBox(); ~MessageBox(); std::string_view message(std::string_view msg); }; #endif // MESSAGELIB_HPP
تعاریف مربوطه:
#include "messagelib.hpp" MessageBox::MessageBox() { } MessageBox::~MessageBox() { } std::string_view MessageBox::message(std::string_view msg) { return msg; }
استفاده از کتابخانه در برنامهها یا کتابخانههای دیگر:
#include <iostream> #include "messagelib.hpp" using namespace std; int main() { MessageBox msg; cout << msg.message("Hello Boy!") << endl; std::cin.get(); return 0; }
- 1
-
در 8 دقیقه قبل، نیما غراب گفته است :سلام بر دوستان و اساتید گرامی.
کاربرد کلمه کلیدی
__decspec(dllexport)
چیست و چه زمانی باید ازش استفاده کنیم؟سپاس گزارم.
درود،
واژهٔ کلیدی
__decspec
با صفتِdllexport
به شما اجازه میدهد تا توابع و متغیرها را برای اعلان در مرحلهٔ ورود و خروج کنترل کنید. زمانی که بخواهید دادهها، توابع، کلاسها و یا توابع عضو کلاس را از طرف DLL مورد استفاده قرار دهید از این کلمهٔ کلیدی استفاده میشود.- 1
-
در 6 دقیقه قبل، سید محمد عباسی گفته است :پس فعلا در سطج آزمایشیه . ولی خوبه که گذاشتن واسه آزمایش ، توسعهدهندگان نرمافزار ، خوشحال بشن .
امیدوارم که تمام ایراداتش رفع بشه و توسعهدهندگان مشکلی نداشته باشن با این فریمورک ، چون واقعا در سطح خودش عالیه.
آزمایشی نیست، نهایی شده هست.
اما خب فعلاً جای کار داره و باید از سمت مرورگرها و سرورها به خوبی بهینهسازی بشه.
در کل این ویژگی در کنار دیگر ویژگیهای کیوت یکی از بهترین موارد است.
- 1
-
در 1 دقیقه قبل، سید محمد عباسی گفته است :ایول! با یه تیر ، چند نشون رو زدند! با این فناوری یعنی دیگه میتونیم در سمت وب و پلتفرمهای مختلف با یک بار کد نوشتن چندین بار اجرا کنیم! این واقعا عالیه .
روی سرورها بخوابم بارگذاری کنیم مشکلی به وجود نمیاد ؟ یا فقط آزمایشیه ؟ میشه روش حساب کرد ؟ یعنی از کتابخونههای دیگه استفاده نکنیم ؟
فعلاً به بلوغ نرسیده، باید در سمت مرورگرها و سرور بهینهسازی بشه.
- 1
-
همانطور که میدانید اخیرأ فناوری وباسمبلی (Qt for WebAssembly) معرفی شده است، توسعهدهندگان کیوت یک نمایشگر برای اجرای خروجیهای QML در مرورگر طراحی کردهاند که به شما این امکان را میدهد تا کدهای نوشته شدهٔ خود را در محیط مرورگر اجرا کنید.
در این بخش میتوانید آخرین نسخهٔ مرتبط با Qt Design Viewer را برای آزمایش پیدا کنید، نمایشگر Qt Design Viewer با چند طرح آماده برای آزمایش همراه است.
برای اجرای یک برنامهٔ سفارشی تحت QML، باید یک پروندهٔ qmlproject. که پروندهٔ اصلی QML است را تعریف کنید. این همان قالب اساسی پروژه است که توسط Qt Design Studio و Qt Creator برای پروژههای QML استفاده میشود. پوشهٔ پروژه باید به صورت یک فایل Zip فشرده شود و سپس در Qt Design Viewer بارگذاری گردد. همچنین میتوانید از نسخهٔ Qt Design Studio 1.3 یک فایل منبع را از پروژه ایجاد کرده و بستهای را که به صورت خودکار ایجاد شده است را بارگذاری کنید.
آزمایشهای مربوطه بر روی مرورگرهای Safari، Chrome، FireFox و Edge انجام شده است و عملکرد اجرای QML در تمامی آنها بسیار خوب است. البته زمان تدوین و پیکربندی به مرورگر شما بستگی دارد، اما عملکرد واقعی برنامه پس از اجرا همانند نسخهٔ دسکتاپ است.
سیستم Qt Design Viewer همراه با اکثر ماژولهای QML به عنوان بخشی از کیوت است که در نسخهٔ ۵.۱۴ ساخته شده است. همچنین، این محیط بر روی سیستمعاملهای iOS و Android اجرا میشود که یک روش ساده را برای اجرای طرحهای آزمایشی ارائه میکند.
این فناوری جدید است، بنابراین در صورت مشاهدهٔ مشکلات آن را به تیم توسعهدهندهٔ آن گزارش دهید.
- 2
-
در 1 ساعت قبل، فرهاد شیری گفته است :تصور کن! سیستم نرم افزاری حمل و نقل ریلی را توسعه دادید! در این سیستم به صورت گرافیکی تمام خطوط ریلی ایستگاه و تمام علائم مربوطه با جزئیات مشخص شده و همچنین نحوه حرکت قطارها در این سیستم به صورت لحظه ای نمایش داده میشه! بنابراین عمکلرد محیط گرافیکی کاربری نرم افزار خیلی حائز اهمیت هست که تمام المانها به درستی وظیفه خودشون را انجام بدهند، بنابراین ابزارهای مانتیورینگ عملکرد محیط کاربری برنامه ها خیلی مهم و کاربردی خواهد بود.
مثالت انقدر خوب بود که گفتم متنی هم تشکر کنم ازت
-
در در 23 مهر 1398 در 15:18، amirb گفته است :با سلام و عرض خسته نباشیدـ
می خواستم بدونم Qt safe renderer چیه و به چه کاری میاد و چه زمانی باید ازش استفاده کرد.
با تشکر
خوشم میاد سوألت بسیار بسیار تازست!
یعنی کیوت این فناوری رو چند روزی نیست معرفی کرده!
همچین کاربرای فعالی داریم ما... احسنت
به هر حال، من سعی کردم چند بار این ویژگی رو بخونم و اگر درست متوجه شده باشم، با توجه به درکی که از مستندات خودش داشتم باید همچین تعریفی داشته باشه که در ادامه بازنویسی کردم.
در صنایع مختلفِ پزشکی و اتوماسیونهای پیشرفته و یا خودروسازی نمایش اطلاعاتِ ایمن، مرتبط با اطلاعات مربوط به خطاها و گزارشات بحرانی که بسیار هم مهم و حساس هستند که متخصصها باید به این اطلاعات در زمان خودش همراه با اطلاعات صحیح و ایمنی از طریق صفحه نمایشگرهای دیجیتالی در اختیار داشته باشند مهم است. برای مثال در صنعت پزشکی، پرستاران، پزشکان و تکنسینها از وسایل پزشکی بسیار مهمی استفاده میکنند که باید این تجهیزات به حداکثر ایمنی در زمان ارائهٔ گزارشها در جای مناسب خودشون تضمین شوند.
با توجه به مشکلات احتمالی که در زمان ارائهٔ این گزارشات در زمان رندر سازی سمت UI (که بسیار حساس هستند و نباید تأخیر و یا اختلالی در ارائهٔ این موارد به وجود بیاد) کیوت سعی کرده راهکاری را ارائه بدهد تا این مشکلات احتمالی را تضمین و ایمن سازد.
بنابراین، ماژول Qt Safe Renderer هم یک راهکار از طرف شرکت کیوت است برای ارائهٔ اطلاعات حساس و ایمن در برنامههای کاربردی ایمنی که عملکرد آنها بر اساس کیوت است. این ماژول یک محصول تجاری است که باید جداگانه خریداری شود، زیرا بخشی از مجوزهای توسعهٔ برنامه یا دستگاه مربوط به این ویژگی بخشی از برنامههای کیوت محسوب نمیشوند.
این راهکار برای این ارائه شده تا، یک سیستم جداگانه برای ادغام و یکپارچهسازی یک سیستم با پردازشهای جداگانه جهت عملکردهای مهم ایمنی و غیر ایمنی باشد. با توجه به ساختاری که دارد، پردازشهای مورد نیاز را به یک زیر سیستم مستقل در فرآیند اختصاصی اجرا میکند، مانند ظبط گرافیکی از اطلاعات مهم و ایمنی که این موارد را تضمین خواهد کرد. در واقع این راهکار، وظیفهٔ مانیتورینگ اصلی عملکرد رابطکاربری اصلی و خطاهای موجود در آن را بر عهده میگیرد تا اختلالی در زمان ارائهٔ اطلاعات مهم و حساس رُخ ندهد.
- 1
مشکل خروجی گرفتن از اندروید در Qt 5.12
در موبایل و اِمبِدها
ارسال شده در
مشکل به خاطر عدم بهروزرسانی مخازن است. لطفاً با v-p-n وارد شوید و سعی کنید مخازن را بهروزرسانی کنید. سپس در حین qmake و کامپایل gardle توسط خود کیوت کریتور دریافت و ادغام خواهد شد.