رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران

kambiz behnia

کاربـــر رسمی
  • تعداد ارسال ها

    27
  • تاریخ عضویت

  • روز های برد

    1

پست ها ارسال شده توسط kambiz behnia


  1. از CreateProcess  برای اجرای برنامه استفاده کردم. و دیگر مشکلی ایجاد نشد. 

    به نظر دوستان اجرای برنامه دوم از طریق کفته شده موجب وابسته شدن دو برنامه خواهد شد یا یامشکل جای دیگری است و ممکن است با استفاده از CreateProcess هم پیش بیاید.

    متشکرم.

    • پسندیدن 1

  2. با سلام

     من DLLای دارم که با یک برنامه Win32 داده هایی را ردو بدل می کند لذا هنگام load شدن چک میکند تا اگر آن APPWin32 در حال اجرا نباشد آنرا از طریق دستور زیر اجرا کند.

    std::string cmd = "start APPWin32.exe";
    system (cmd.c_str());
    

    حال اگر برنامه APPWin32 بطور جداگانه اجرا شود. هر چند بار که آن DLL برای اجرا load شوند امکان مشکلی پیش مشاهده نمی شود. حتی اتمام کار آنها.

    حال فرض کنیم APWin32 در حال اجرا نباشد. وقتی DLL اول load میشود چون APPWin32 در حال اجرا نیست آنرا با روش گفته شده در با لا اجرا میکند و ادامه کار ...

    در ادامه وقتی DLL های بعدی load می شوند چون از قبل AppWin32 در حال اجرا بوده اقدام به اجرای آن نمیکنند و ادامه کار صورت میگیرد.

    وقتی dllهای دوم به بعد کارشان خاتمه پیدا میکند و از حافظه خارج میشوند مشکلی در ادامه حتی load شدن dllهای جدید نمیشود.

    حال اگر dll اول کارش خاتمه یابد و از حافظه خارج شود. دیگر dll ها نمیتوانند کارشان را به دستی انجام دهند حتی صفحه ui آنها به اصطلاح frezz میکنند و حتی اجازه Load شدن به Dll جدید داده نشده و آن هم Frezz می شود.

     برنامه را با VS2017 نوشته ام و روی Windows 10 مشکلی نیست ولی اگر آنرا روی Windows XP اجرا کنیم این مشکل مشاهده می شود "در VS2017 نوع SDK را نسخه 7.0 و Platform Toolset را   Windows XP (v141_xp) تنظیم کرده ام ".

    بنظر شما مشکل چیست؟

    لازم به ذکر است در حالتی که سیستم frezz شده آن APPWin32  را از حافظه خارج کنم برنامه ها از حالت frezz خارج می شوند!


  3. در 15 ساعت قبل، فرهاد شیری گفته است :

    دارای سیستم عامل نیست یعنی؟ با IAR کامپایل شده؟ یا سیستم عامل توکار مثل freebsd

     

    این FIN منظورتون همون ACK byte هست که معمولا برای ارسال و دریافت صحیح بسته ازش استفاده میکنیم؟

    یعنی چی که هیچوقت ارسال نمیشه؟ چطوری تست کردید؟

    کلا با چه پروتکلی کار میکنید با چه میکروکنترلری؟

    الان منظورتون از سیستم عامل کدوم هست؟ سمت کلاینت که خوب هنوز درباره اش توضیحی ندادید ویا سمت سرور منظورتون هست که فکر نکنم منظورتون سرور باشه چون به پروتهای کلاینت ها که دسترسی ندارید از سرور

    بله تقریبا متوجه برنامه شما شدم ولی سوال این هست که 

    از چه سیستم عاملی استفاده میکنید ؟ توکار هست ؟ به سورس برنامه کلاینت دسترسی ندارید ولی به تنظیمات سیستم عامل که دسترسی دارید میتونید تعداد درخواستها را افزایش بدید اگر nix-base باشه که با fcntl خیلی کارها میشه کرد

    این برنامه FIN_WAIT_2 را دقیقا نمیدونم چی هست ؟ ولی قطعا بنظر من هم تایم اوت یکی از روشهای خیلی خوب برای کنترل پورتهاست.

    گفتم سیستم عامل نداره. چون یک مداربوده که خودشون طراحی کردن برای کنترل دستگاه و برای گرفتن فرمان و اطلاعات به سرور متصل میشوند. تا جایی که اطلاع دارم توش از میکرو کنترل استفاده میشه در باره طراحیش چیزی نگفتن و فعلا فقط همین برد با مستندات ناقص در دسترس هست.

    روی سیستم Wireshark نصب کردن و گفتن بعد از پاسخ فرمان FIN خودش دیگر فرمان FIN را ارسال نمیکند و این موجب میشود تا در طرف سرور برای متوجه شدن پایان کار از تایم اوت استفاده کند.

    طرف کلاینت که هیچ کنترلی نداریم ولی سیستم عامل سرور ویندوز هست و از  فرمانهای کنترلی آن استفاده کردم و چون در انتها باز هم مجبور به استفاده از تایم اوت میشود این امر موجب وقفه در کار کل سیستم میشود.

     

    خواستم پیشنهاد بدم به همکاران تا مداری طراحی کنند تا بین کلاینها و سرور قرار بگیره و به شکلی این مشکل را حل کنند امیدوارم کارساز باشد


  4.  با تشکر از پاسخ شما

    برنامه طرف کلاینت بر روی سیستمی اجرا میشود که دارای سیستم عامل نیست

    CN.png.6a63fc5a447040f012d218052aa1d33e.png

    همانطور که در دیاگرام دیده میشود وقتی سوکت مبدا در خواست بستن سوکت را درخواست کرد بعد از چند مرحله در حالت FIN_WAIT_2 باقی میماند و منتظر فرمان FIN از طرف مقابل میشود که این فرمان هیچوقت از طرف کلاینتها ارسال نمیشوند لذا آنقدر منتظر باقی میمانند تا توسط سیستم عامل پورت اشغال شده آزاد گردد بدین شکا یک پورت برای مدت اشغال باقی میماند در صورتی که نیازی به آن نیست.

    البته درست میفرمائید از طرف کلاینت پروسه بستن سوکت بدرستی اجرا نمی شود و این نکته که بستن سوکت را تا نیمه ادامه میدهد بخاطر اصرار زیاد بود که متاسفانه آنرا تا آخر ادامه ندادند و نیمه کاره رها میکند "کد طرف کلاینت در دسترس (طبق معمول) نیست و امکان اصلاح آن وجود ندارد".

    به دنبال راه حلی بودم تا وقتی یک طرف در حالت FIN_WAIT_2 قرار گرفت منتظر تایم اوت نمانده و سریعتر سوکت گرفته شده آزاد گردد.

     

    بیشتر منظورم از زیاد این بود که اتصالات مرتبا وصل و پس از اتمام کار اتصال قطع خواهد شد. و گاهی اوقات تعداد درخواست اتصال از تعداد اتصالهایی که سیستم عامل میتواند اختصاص دهد بیشتر شده و کانکشن جدیدی قبول نمیکند. لذا بابد تا جایی که امکان دارد سوکتهایی که کارشان تمام شده هرچه سریعتر آزاد شده و برای اتصالات دیگر قابل اختصاص باشند.

     

     

    تا آنجا که توانسته ام و جستجو کردم همگی تنظیم تایم اوت FIN_WAIT_2 را بع عنوان راه حل ارائه داده بودند به دنبال این بودم دوستانی که با این مشکل برخورد کرده اند غیر از این مورد راه حلی دیگری هم  پیدا کرده اند.


  5. با سلام

    جهت ارتباط بین دو سیستم از  Socket TCP استفاده میکنیم.

    متاسفانه در طرف کلاینتها سوکتها به درستی بسته نمیشوند (مراحل بستن تا آخر ادامه پیدا نمیکنند) و این امر موجب میشود تا تعداد زیادی از سوکتها در طرف سرور در حالت FIN-WAIT-2 باقی بمانند. جهت رفع این مشکل چه راه حلی پیشنهاد میکنید.

    این نکته را هم اضافه کنم

    1- تعدا کلاینهایی که به سرور وصل میشوند و یا وصل شده اند زیاد است.

    2- بطور نرمال کلاینتها بعد از اتمام کار ارتباط خود را قطع میکنند به عبارتی اتصال دائم برقرار نیست

    2- بعد قبول درخواست اتصال هر کلاینت برای هندل هریک از یک Thread مستقل استفاده میشود

    3- در خواست بستن سوکت در Threadی که مسئول سرویس دهی به آن سوکت است انجام میشود.

     

    در ادامه سوال، آیا برای قبول درخواست اتصال، خواندن، نوشتن و بستن سوکتها نیاز به استفاده از mutex هست (به عبارتی آیا منبع مشترکی را مورد استفاده قرار میدهند)

    من فعلا از برنامه در محیط Windows استفاده میکنم در صورتی که پاسخ وابسته به نوع سیستم عامل است لطفا مشخص کنید.

    متشکرم.


  6. در 2 ساعت قبل، فرهاد شیری گفته است :

    std::mutex که مشخص جز استانداردهای زبان سی پلاس پلاس هست که از نسخه 11 به بعد قابل استفاده است.

    Windows Mutex هم که جز توابع سیستمی ویندوز windows api32 هست 

    کار هر دو مشترک هست، برای اشتراک گذاری داده در ناحیه بحرانی استفاده میشوند، منتهی به شرایط استفاده برنامه شما بستگی داره! مثلا اگر در سطح سیستمی تو ویندوز کد میزنید و پرفورمنس بالا مد نظرتون هست قطعا ویندوز API ها حرف اول را میزنند چرا چون این اینترفیس ها مستقیما با زبان سی نوشته شده اند، و مستقیما در کد اسمبلی کتابخانه استفاده شده اند بنابراین از لحاظ کارایی خیلی بالا هستند. 

    ولی اگر این حد از سیستمی بودن مدنظرتون نیست قطعا کتابخانه استاندارد سی پلاس پلاس خیلی مفیدتر و نگهداری و همچنین پرتابلیتی (قابلیت حمل) بالاتری هم نسبت به API های ویندوز داره!

    و البته معمولا در برنامه های Win32 بیشتر تمایل هست که از اینترفیس های قدرتمند API32 استفاده بشه! چون خیلی بیشتر تو ویندوز کارایی دارند.

    قطعا همواره یکی از موارد پرفورمنس هست. یکی از دوستان بیان کرده بود جایی اقدام به مقایسه استفاده از این دو کرده و کارآیی std::mutex را بیشتر دیده بود. که این مورد برای خودم سوال بود لذا اقدام به تست کردم و دیدم از نظرزمانی اختلاف زیادی با هم ندارند و ضمنا Windows Mutex سریعتر است. 


  7. در 20 ساعت قبل، فرهاد شیری گفته است :

    کدهای شما درست است و قابل اجرا هستند! به همین دلیل هم بدرستی کار میکنند!

    از بابت توضیح در پاسخ اول متشکرم  سعی میکنم کتابی را که معرفی کرده بودید حتما مطالعه کنم. احساس میکنم پاسخ دوم با پاسخ اول در تناقض باشد و بطور کلی استفاده به این شکل درست نباشد. خودم فکر میکنم چون مقدار بازگشتی تابع را مستقیما به دستور copy ارسال کرده ایم و احتمالا در آن از حافظه استک استفاده نشده در عمل دوچار مشکل نشده ایم ولی چنانچه اگر به صورت دیگری استفاده کنیم حتما مشکل حافظه خواهیم داشت مثلا خودم دوباره strcpy را بازنویسی کنم بطوریکه در ابتدا آن اقدام به تعریف یک آرایه 256 تای از char نمودم اگر چه در بدنه آن هیچ استفاده ای از آن نکردم ولی موجب خراب شده داده های مورد نظر من شد و تابع بهصورت درست عمل نکرد و وقتی آن حاظه را از استک نگرفت برنامه کار مورد نظر من را انجام داد.

    یکی از دوستان برای چنین مواردی اصطلاح جالبی داشت "برنامه به غلط درست کار میکند."


  8. در برسی کدهای برنامه ای که قبلا نوشته شده بود و ظاهرا در حال حاضر بدرستی کار می کند به صحت عمل تابع مشابه doXOR شک کردم. متن doXOR و روش استفاده شده از آن را در زیر اضافه می کنم. لازم به ذکر است فقط به روش زیر استفاده می شود.

    char *doXOR(char *cData1, char * cData2)
    {
    	char cData[256];
    	//
    
    	for (int i = 0; i < 256; ++i)
    	{
    		cData[i] =cData1[i] ^ cData2[i];
    	}
    	//
    	cData[255] = 0;
    
    	return cData;
    }
    
    void usedoXOR()
    {
    	char cData1[256];
    	char cData2[256];
    	char cData3[256];
    	//
    	memset(cData1, 0, sizeof(cData1));
    	memset(cData2, 0, sizeof(cData2));
    	memset(cData3, 0, sizeof(cData3));
    
    	strcpy(cData1, "In C, the following 6 operators are bitwise operators (work at bit-level)");
    	strcpy(cData2, "Typical usage of a right shift operator in C can be seen from the following code.");
    
    	strcpy(cData3, doXOR(cData1, cData2));
    }

     همانطور که میبینید در doXOR در انتها آدرس cData که یک متغییر محلی است برگشت داده می شود و من انتظار دارم قبل از خارج شدن از doXOR حافظه های اختصاص داده شده آزاد گردد لذا بهد از خروج از doXOR آدرس cData معتبر نخواهد بود اگر چه همچنان حاوی اطلاعات قبلی است.

    نظر شما چیست.

    1 - نوشتن به این شکل مشکل دارد یا نه؟ 

    2 - اگر مشکلی دارد آیا نحوه استفاده ما در usedoXOR  از خروجی doXOR به عنوان ورودی strcpy موجب شده تا این مشکل خود را نشان ندهد؟

    3 -  آیا نوع کمپایلر و سیستم عامل میتوانند در پاسخ به دو سوال بالا تاثیرگذار باشند.


  9. در در 26 تیر 1398 در 18:05، فرهاد شیری گفته است :

    اول از سوال دوم شروع کنم !

    فلسفه SP ها در SQLServer به علت اینکه دستوری به نام Alter وجود دارد این امکان را به برنامه نویس میده که هر وقت خواست کل منطق SP را مجددا بنویسه و SP جدید را Execute کنه که خوب البته که این امکان فوق العاده ست ولی باعث از بین رفتن یکپارچگی داده هم میشه! و البته که این مهم به علت وجود دستور Alter هست و الباقی ماجرا...

    ....

     

     با این حساب باید تمرکزم رو روی Meta Data قرار بدم اگر چه با توجه به استفاده از SP در برنامه های دیگر کارفرما به استفاده از آن و یا مواردی مشابه آن تمایل بیشتری دارد. آخه عمری با روش SP کارکردن و به آن عادت کرده اند. از وقتی که گذاشتید متشکرم. اگر در ادامه در مورد استفاده از Meta Data به مشکل و یا سوالی برخوردم مزاحم شما خواهم شد.


  10. در 3 ساعت قبل، فرهاد شیری گفته است :

    قطعا مفسر اسکریپتی Lua خیلی معروفتر و تکمیلتر از اسکریپتور معرفی شده در پست های قبلی اشاره شد، ولی روش کار همون هست.

    خیر تغییر logic میسر نخواهد بود! بهتر بود یکم سنا

     

    ریوی خودتون را واضحتر بیان کنید تا روشهای بهتری بشه پیشنهاد داد!

    فرض را براین بگذاریم که یک Object داده وجود دارد (که میتواند یک کلاس از کلاسهایی باشد که خودمان ایجاد کرده ایم و یا یک آرایه از کاراکتر و یا هر دیتا تایپ داخلی ++C "فرض کنیم حتی امکان سریالایز کرده داده وجود داشته باشد") حال میخواهیم برحسب شرایط تغیراتی روی این داده انجام گیرد. در حالت نرمال در داخل کد برنامه این کار را بکمک نوشتن متد ها انجام میدهیم. واضح است که با تغییر logic هرکدام از این متد ها مجددا باید کل برنامه کمپایل گردد.

    حال با توجه به اینکه logic مورد استفاده از قبل مشخص نیست و تقریبا هر چند وقت یکبار تغییر میکند و حتی گاهی تصمیم براین قرار میگیرد که از ساعت 9 تا 12 ظهر یک منطق و از 12 ظهر تا 2 منطق دیگر و دوبار منطق قبلی برای logic آن تابع در نظر گرفته شود. (چیزی شبیه تصمیم گیری بعضی از مدیران ?

    فرض کنیم قراراست مشخص کنیم چه وسایل نقلیه ای می تواند از یک محور خاص عبور کند در حالت نرمال میگوئیم همه در شرایط خاص بعضی حال باید این بعضی را مشخص کنیم.

    تصمیم بر اسال شماره پلاک باشد؟ کدام شماره ها

    بر اسال مدل و سال ساخت باشد و یا رنگ هم در نظر گرفته شود؟

    راننده هم مهم است؟

    مبدا و مقصد چطور؟

    آیا باید به وسیله نقلیه چیزی اضافه و یا کم شود؟

    آیا باید وسیله خاصی داخل خودرو باشد باشد؟

    همه این موارد میتواند موجب تصمیم گیری  جهت اعلام محدودیت های ترافیکی شود.

    شاید عجیب بنظر برسد ولی محدودیتهای ترافیکی اعلام شده در موارد خاص تابع هیچ قانون کلی نیست و با توجه به شرایط محیط، زمانی و مکانی اعلام و اعمال میشود.

     

    یک مثال

    وقتی ما مثلا در Sql Server اقدام به ایجاد Stored Procedures میکنیم دیگر برنامه ها اقدام به صدا کردن این Stored Procedures خواهند کرد و این کار کد داخل ان خواهد شود حا هرگاه من اقدام به تغییر logic این Stored Procedures کنم بعد از ذخیره درصورت صدا کردن این Stored Procedures توسط هر برنامه دیگری کدهای جدید اعمال خواهند شد.

     

    آیا امکان داشتن چنین قابلیتی در کنار برنامه های ++C وجود دارد؟ (برای دیگر زبانها چطور؟)


  11. در 6 دقیقه قبل، فرهاد شیری گفته است :

    اگر منظورتون از تغییر کد helloWorld این هست که در در زمان اجرا کلا logic تابع که الان دستور return هست را تغییر بدید ویا logic جدیدی اضافه کنید که همانطور که توضیح داده شد خیر نه این زبان اسکریپتی ونه هیچ زبان اسکریپتی دیگری چنین کاری انجام نخواهد داد!

    فلسفه مفسرهای اسکریپتی اینچنینی این هست که شما در صورتی که توابع مورد نظر خودتون را از قبل کامپایل کرده باشید، می توانید در زمان اجرا با استفاده از دستوراتی که مفسر اسکریپتی در اختیار قرار میده توابع خود را با ورودی های مختلف که می توانند در یک تکست فایل هم قالب بندی شده باشند اجرا کنید.

    فقط همین...

    اتفاقا منظورم همان تغییر logic تابع هست. یعنی امیدی نیست. 

    نظرتان در باره پاسخ کاربر quark چیست؟

    در 12 ساعت قبل، quark گفته است :

    زبان های اسکریپتی زیادی الان وجود دارن که هرکدوم یکسری مزیت و یکسری معایب دارن که با توجه به کارتون باید یکیو انتخاب کنید. من پیشنهادم همین Lua هست که صرفا بخاطر اینکه قبلا باهاش کار کردم و از نظر سرعت و سادگی خوب بوده میگم. شاید زبان اسکریپت بهتری برای کار شما وجود داشته باشه که من ازش مطلع نیستم. بهتره یک جستجو بکنید.

    توجه داشته باشید که شما تو زبان اسکریپتی مثل Lua نمیتونید دقیقا بایت به بایت یک فانکشن رو تغییر بدید. تغییراتی که میتونید بدید در حده

    1- صدا زدن فانکشنهای از قبل بایند شده

    2- تغییر/مقدار دهی متغییرهای از قبل بایند شده

    3- ساخت فانکشن های جدید (ترکیبی از فانکشنهای بایند شده ++C و کدهای Lua)

    هست و بییشتر از این انتظاری از یک زبان اسکریپتی نیست. که البته همین هم فوق العاده کاربردیه.

     


  12.  

    در 11 ساعت قبل، بهنام صباغی گفته است :

    درکل توابع از قبل کامپایل شده و ریجستر شده رو میتونه ران کنه یعنی یه جورایی میتونید مفسر خودتون رو طوری که دوست دارید و کاربردتون هست تعریف کنید مثل کاری که ما کردیم.

    همانطور که جناب آقای شیری فرمودن ارائه مثال میتواند تاثیر بهتری داشته باشد. چون با توجه به توضیحات شما ذهن من رفت طرف فانکشن پونتر و استفاده از آنها. 


  13. در در 23 تیر 1398 در 21:09، quark گفته است :

    بنظرم مشکل شما با یک زبان اسکریپتی حل میشه. کافیه تا توابع و قابلیت هایی که میخواین رو از ++C به یکی از زبان های اسکریپتی مثل Lua بایند کنید و بعد از اون میتونید قابلیت هایی که بایند شده رو در قالب یک فایل تکست یا حتی یک string اجرا کنید.

    احتمالا استفاده از روش پیشنهادی شما پاسخگوی من باشد. حال بنظر شما استفاده از چه زبان اسکریپتی در ++C از نظر سرعت برنامه و سهولت استفاده کارآمدتر خواهد بود


  14. در در 23 تیر 1398 در 19:14، فرهاد شیری گفته است :

    یکی از پارادایم های برنامه نویسی همین موضوع کنترل رفتارهای برنامه در شرایط و ورودی های مختلف هست.

    یکی از راه های پرکاربرد که در سیستم عامل لینوکس هم خیلی شایع هست استفاده از متا دیتا فایلهاست یعنی شما نوع رفتاری که برنامه باید ازخودش نشون بده را داخل یک فایل تکست می نویسید مثل فایل زیر....

    حالا وقتی برنامه را با متادیتا های فوق بنویسید یعنی رفتار برنامه را در زمان اجرا می توانید تغییر بدید!

    البته بحث استفاده از متادیتا ها خیلی گسترده است با چند خط نمیشه توضیح داد ولی جان مطلب همین بود که عرض کردم فکر کنم کار شما را راه بندازه!

    اصولا چه نیازی هست که شما بخواهید از داخل برنامه سی پلاس پلاس کدهای پایتون را اجرا کنید من فکر میکنم که مطلبی که عرض کردم مشکل شما را رفع میکنه البته لازم هست که کمی هم مطالعه کنید راجع به Meta Data 

    اگر درست متوجه شده باشم استفاده از متا دیتا پاسخ گوی من نخواهد بود چون لازمه استفاده ازآن این است تا در برنامه اصلی بدانیم باید دنبال چه مواردی بگردیم


  15. در 26 دقیقه قبل، فرهاد شیری گفته است :

    خوب اگر منظورتون رفتار های متفاوت یک تابع در زمان اجراست که اغلب تکنیک های شی گرایی و الگوهای طراحی دقیقا برای این قبیل چالش ها ایجاد شده اند.

    بنابراین به راحتی می توانید یک تابع با یک نام ویک امضا ثابت داشته باشید که در زمان اجرا بسته به شرایطی که تعیین میکنید رفتارهای مختلفی داشته باشد.وقطعا هم باید از قبل کامپایل شده باشند اگر منظور شما استفاده از procedure این بوده باشد.

    البته روشهایی هم هست که تکنیک های تزریق سورس کدهای پویا و استاتیک مشهور هستند که بیشتر برای کرک کردن استفاده میشود البته نه در سورس برنامه بلکه در خروجی اسمبلی برنامه!

    و اگرهم اهداف دیگه ای دارید که پیشنهاد میکنم منابعی درباره کامپایلر زمان اجر دات نت JIT ویا منابعی درباره ماشین مجازی جاوا JVM ویا Dalvik مطالعه داشته باشید البته کامپایلرهای زبانهای مفسری مثل پایتون و پی اچ پی هم خیلی کمک میکنه!

    منظور رفتار متفاوت در زمان اجرا هست ولی چون از قبل نوع عملکرد مشخص نیست و تغییرات زیاد است میخواستم به روشی بخش کمپایل مجدد کد را به شکلی حذف کنم.

    فکر نمیکنم مبحث تزیق کد کاربردی برایم داشته باشد.

     اگر درست متوجه شده باشم دات نت و جاوا برای اجرا سورس کد را به یک واسطه تبدیل و کدهای داخل آنرا اجرا میکنند حال در این حالت اگر سورس کد اصلی تغییر کند آیا دوبراره بطورخدکار آنرا کمپایل خواهند کرد

    در باره Dalvik چیزی نمیدانم شاید جوابم را بدهد اگر تا حدودی نزیک پاسخم بود مزاحم خواهم شد.

    اگر بتوان از داخل برنامه c++ از زبان پایتون استفاده کرد و دادهایی را تبادل نمود و ایتون قابلیت کمپایل (منظور همان تفسیر دوباره است ) زمان اجرا را داشته باشد احتمالا کارساز خواهد بود

    متشکرم


  16. در 11 ساعت قبل، Max Base گفته است :

    با سلام وقت بخیر,

    این دومین پیام و اولین پاسخی است که در این انجمن ارسال می کنم.

    این را هم ذکر کنم که سوالتان واضح و شفاف علمی نیست.

    بهرحال در پاسخ دادن و نقد کردن پیام من راحت باشید!

    مکس بیس / Max Base

    کمی گنگ بودن سوال را قبول دارم. 

    فرض کنید دربرنامه به Sq Server  وصل شده و اقدام به صدا کردن پروسیجرهایی که از قبل نوشته و در دیتابیس ذخیره شده است مکنیم. هر وقت ما اقدام به تغییر یک پروسیجر بکنیم از آن به بعد آن کد جدید هنگام صدا کردن پروسیجر اجرا خواهد شد. میخواستم مشابه این را داشته باشم.

    گفتم شاید کتابخانه هایی وجود داشته باشند که به کمک آنها بتوان کدهای داخل فایلی را parse کرده و دستورات آنرا اجرا کرد چیزی شبیه یک مفسر کوچک زبان که دستورات محدودی را شامل میشود.

    مثلا در windows میتوانیم بخشی را کد را داخل فایل dll قرار دهیم و هرگاه کد dll را عوض کرده و دوباره کمپایل کنیم و فایل dll را جایگزین فایل قبلی کنیم تغییرات جدید اعمال خواهد شد. تقریبا میخواهم مشابه این کار را انجام دهم بطوریکه لازم به کمپایل مجدد چیزی نباشد و تغییرات در حد عوض کردن یک فایل text باشد.

    شاید اینطوری بهتر باشد چگونه یک فایل script  که حاوی کدهای است که در امکان تغییر داده های اصلی را میدهد را اجرا کنیم.   


  17. فرض کنیم متدی  به نام Calculate برای یکی از کلاسها درون برنامه وجود دارد و برحسب شرایطی فرا خوانی میشود. آیا راهی وجو دارد که بتوان کد داخی آنرا تغییر داد طوری که بعد از تغییر برنامه کد تغییر یافته را اجرا کند همانند  proceger  در sql server


  18. در در 29 خرداد 1398 در 18:22، فرهاد شیری گفته است :

    تو لینوکس اگر 0 پاس بدید فرایند بلاک میشه ولی قطعا نمیتونه روی write-fds ویا read-fds چیزی بنویسه! به همین علت مقدار بازگشتی عددی بدون علامت بزرگتر از صفر خواهد بود که به این معنی است که در زمان مشخص شده بلاک فرایند اطلاعات صحیحی دریافت نشده!

    منظورتون از ویندوز متوجه نمیشم چون این توابع از استانداردهای posix هست! البته اگر منظورتون استفاده از این دستورات در کامپایلرهای gcc ویندوز هست، که باید عرض کنم که در کامپایلرهای gcc ویندوز هدر فایل sys/types.h با نسخه های تحت لینوکس کاملا متفاوت هست بنابراین از این دستورات در ویندوز استفاده نمی شود.

    یا حداقل من که تا حالا استفاده نکردم البته بعید میدونم با کامپایلر ویژوال سی هم شدنی باشه! 

    به این علت که اساس کار این توابع بر روی جریان های ورودی فایلها کار میکند چیزی که لینوکس بر این پایه بنا شده است بنابراین در ویندوز مطلب روشن است. 

    تو برنامه ای که در به ارث رسیده مقدار پارامتر اول در SELECT صفر داده شده و همین استفاده ازآن شده است ضمن آنکه برنامه برای محیط Windows بوده و در محیط VS کمپایل شده.

    • پسندیدن 1

  19. در در 28 خرداد 1398 در 10:09، فرهاد شیری گفته است :

    تصور کنید که یک سوکت اماده برای ارسال اطلاعات دارید جهت تشخیص این موضوع که سوکت مورد نظر امادگیارسال اطلاعات را دارد می توانید از select استفاده کنید.

    بنابراین می توانید تا زمان آمادگی سوکت فرآیند مورد نظر را در یک زمان مشخص بلاک کنید.

    توجه داشته باشید که اگر از استاندارد های posix در لینوکس استفاده میکنید قطعا استفاده از دستورات کنترلی مانند select لازم است.

    البته می توانید تمامی عملیاتهای I/O را در لینوکس با استفاده از دستورات کنترل نمایید.

    یک مثال ساده

    
    
     
     
    struct timeval tWait;
     
     
     
    tWait.tv_sec= nTimeOut / 1000;
     
    tWait.tv_usec= (nTimeOut - tWait.tv_sec * 1000) * 1000;
     
     
     
    fd_set writefds;
     
    FD_ZERO(&writefds);
     
    FD_SET(m_Sock,&writefds);
     
    select(m_Sock+1,NULL,&writefds,NULL,&tWait);
     
    if(! FD_ISSET(m_Sock,&writefds)){
     
    return(-1);
     
    }
     
     
     
    if(sendto(m_Sock,...){
     
    //...
     
    }

     

     هنگام استفاده از دستور select پارامتر اول همواره یک واحد بیشتر از مقدار socket هست. در کدهایی دیده ام که این مقدار را برابر صفر قرار داده اند و همین استفاده ای که شما گفتید را از این دستور کرده اند. البته آن کد برای محیط windows بود (شاید در محیط windows به این پارامتر توجه نکند. حضور ذهن ندارم ولی ظاهرا درویندوز برای همخوانی با توابع c  در محیط unix  و linux توابعی ارائه داده که از بعضی از پارامترهای آن استفاده نمیشود). در هرحال اگر پارامتر اول را صفر دهیم چه اتفاقی میافتد. 


  20. با تشکر از پاسخ

    بطور خلاصه نتیجه گیری خودم از پاسخ های شما را اینجا می آورم لطفا اطلاح بفرمائید.

    1- توابع socket - setsocketopt - bind و listen  برای استفاده در Threadها مشکلی ندارند و برای استفاده از آنها نیاز به استفاده متدهایی برای Lockکردن نیست (منظور استفاده از خود توابع بوده و فرض بر این است که پارامترها حتما مختلف خواهند بود)

    2- برای استفاده از دستور accept باید از متدهای lock کردن منابع استفاده کرد حتی اگر پارامترها مختلف باشند.

    3 - استفاده از توابع select - send , recv  همانند قسمت 1 هستند.

    4 - اگر یک socket که بطور صحیح ایجاد و قابل استفاده است در اختیار داشته باشیم. میتوانیم در یک Thread فقط کار خواندن و در یک Thread دیگر فقط کار نوشتن روی آنرا انجام دهیم.

    5- استفاده از تابع close شرایط واضح خود را دارد و حین و بعد از استفاده از آن پارامتر مشخص شده برای آن نباید در Thread دیگری مورد استفاده باشد.

    6 - تابع connect عملکردی مشابه قسمت 5 دارد.

    سوال 1: اگر مورد 2 صحیح باشد متوجه علت آن نمیشوم چو اگر بقیه برای استفاده در Thread مشکلی نداشته باشند این هم نباید داشته باشد ؟ 

    چون بطور کلی در Thread ها مشکل استفاده از منابه مشترک است آیا توابع ذکرشده منبع حساب میشوند.

     

    سوال 2: در بخش اول نپرسیدم نحوه استفاده از errno برای برسی خطا در سوکتها به چه شکل است هر Thread مقدار جداگانه ای برای خود دارد (بعید بنظر میرسد).

     

×
×
  • جدید...