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

kambiz behnia

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

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

  • روز های برد

    1

تمامی مطالب نوشته شده توسط kambiz behnia

  1. kambiz behnia

    از CreateProcess برای اجرای برنامه استفاده کردم. و دیگر مشکلی ایجاد نشد. به نظر دوستان اجرای برنامه دوم از طریق کفته شده موجب وابسته شدن دو برنامه خواهد شد یا یامشکل جای دیگری است و ممکن است با استفاده از CreateProcess هم پیش بیاید. متشکرم.
  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. kambiz behnia

    متاسفانه کمی درگیر شده ام و خیلی از کارهام متوقف شده در اولین فرصت بررسی و در صورت نیاز با اجازه مزاحم شما خواهم شد. متشکرم
  4. kambiz behnia

    گفتم سیستم عامل نداره. چون یک مداربوده که خودشون طراحی کردن برای کنترل دستگاه و برای گرفتن فرمان و اطلاعات به سرور متصل میشوند. تا جایی که اطلاع دارم توش از میکرو کنترل استفاده میشه در باره طراحیش چیزی نگفتن و فعلا فقط همین برد با مستندات ناقص در دسترس هست. روی سیستم Wireshark نصب کردن و گفتن بعد از پاسخ فرمان FIN خودش دیگر فرمان FIN را ارسال نمیکند و این موجب میشود تا در طرف سرور برای متوجه شدن پایان کار از تایم اوت استفاده کند. طرف کلاینت که هیچ کنترلی نداریم ولی سیستم عامل سرور ویندوز هست و از فرمانهای کنترلی آن استفاده کردم و چون در انتها باز هم مجبور به استفاده از تایم اوت میشود این امر موجب وقفه در کار کل سیستم میشود. خواستم پیشنهاد بدم به همکاران تا مداری طراحی کنند تا بین کلاینها و سرور قرار بگیره و به شکلی این مشکل را حل کنند امیدوارم کارساز باشد
  5. kambiz behnia

    FIN_WAIT_2 یکی از stateهای سوکتهای TCPIP است. متشکرم
  6. kambiz behnia

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

    با سلام جهت ارتباط بین دو سیستم از Socket TCP استفاده میکنیم. متاسفانه در طرف کلاینتها سوکتها به درستی بسته نمیشوند (مراحل بستن تا آخر ادامه پیدا نمیکنند) و این امر موجب میشود تا تعداد زیادی از سوکتها در طرف سرور در حالت FIN-WAIT-2 باقی بمانند. جهت رفع این مشکل چه راه حلی پیشنهاد میکنید. این نکته را هم اضافه کنم 1- تعدا کلاینهایی که به سرور وصل میشوند و یا وصل شده اند زیاد است. 2- بطور نرمال کلاینتها بعد از اتمام کار ارتباط خود را قطع میکنند به عبارتی اتصال دائم برقرار نیست 2- بعد قبول درخواست اتصال هر کلاینت برای هندل هریک از یک Thread مستقل استفاده میشود 3- در خواست بستن سوکت در Threadی که مسئول سرویس دهی به آن سوکت است انجام میشود. در ادامه سوال، آیا برای قبول درخواست اتصال، خواندن، نوشتن و بستن سوکتها نیاز به استفاده از mutex هست (به عبارتی آیا منبع مشترکی را مورد استفاده قرار میدهند) من فعلا از برنامه در محیط Windows استفاده میکنم در صورتی که پاسخ وابسته به نوع سیستم عامل است لطفا مشخص کنید. متشکرم.
  8. kambiz behnia

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

    از بابت توضیح در پاسخ اول متشکرم سعی میکنم کتابی را که معرفی کرده بودید حتما مطالعه کنم. احساس میکنم پاسخ دوم با پاسخ اول در تناقض باشد و بطور کلی استفاده به این شکل درست نباشد. خودم فکر میکنم چون مقدار بازگشتی تابع را مستقیما به دستور copy ارسال کرده ایم و احتمالا در آن از حافظه استک استفاده نشده در عمل دوچار مشکل نشده ایم ولی چنانچه اگر به صورت دیگری استفاده کنیم حتما مشکل حافظه خواهیم داشت مثلا خودم دوباره strcpy را بازنویسی کنم بطوریکه در ابتدا آن اقدام به تعریف یک آرایه 256 تای از char نمودم اگر چه در بدنه آن هیچ استفاده ای از آن نکردم ولی موجب خراب شده داده های مورد نظر من شد و تابع بهصورت درست عمل نکرد و وقتی آن حاظه را از استک نگرفت برنامه کار مورد نظر من را انجام داد. یکی از دوستان برای چنین مواردی اصطلاح جالبی داشت "برنامه به غلط درست کار میکند."
  11. در برسی کدهای برنامه ای که قبلا نوشته شده بود و ظاهرا در حال حاضر بدرستی کار می کند به صحت عمل تابع مشابه 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 - آیا نوع کمپایلر و سیستم عامل میتوانند در پاسخ به دو سوال بالا تاثیرگذار باشند.
  12. kambiz behnia

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

    فرض را براین بگذاریم که یک Object داده وجود دارد (که میتواند یک کلاس از کلاسهایی باشد که خودمان ایجاد کرده ایم و یا یک آرایه از کاراکتر و یا هر دیتا تایپ داخلی ++C "فرض کنیم حتی امکان سریالایز کرده داده وجود داشته باشد") حال میخواهیم برحسب شرایط تغیراتی روی این داده انجام گیرد. در حالت نرمال در داخل کد برنامه این کار را بکمک نوشتن متد ها انجام میدهیم. واضح است که با تغییر logic هرکدام از این متد ها مجددا باید کل برنامه کمپایل گردد. حال با توجه به اینکه logic مورد استفاده از قبل مشخص نیست و تقریبا هر چند وقت یکبار تغییر میکند و حتی گاهی تصمیم براین قرار میگیرد که از ساعت 9 تا 12 ظهر یک منطق و از 12 ظهر تا 2 منطق دیگر و دوبار منطق قبلی برای logic آن تابع در نظر گرفته شود. (چیزی شبیه تصمیم گیری بعضی از مدیران ?) فرض کنیم قراراست مشخص کنیم چه وسایل نقلیه ای می تواند از یک محور خاص عبور کند در حالت نرمال میگوئیم همه در شرایط خاص بعضی حال باید این بعضی را مشخص کنیم. تصمیم بر اسال شماره پلاک باشد؟ کدام شماره ها بر اسال مدل و سال ساخت باشد و یا رنگ هم در نظر گرفته شود؟ راننده هم مهم است؟ مبدا و مقصد چطور؟ آیا باید به وسیله نقلیه چیزی اضافه و یا کم شود؟ آیا باید وسیله خاصی داخل خودرو باشد باشد؟ همه این موارد میتواند موجب تصمیم گیری جهت اعلام محدودیت های ترافیکی شود. شاید عجیب بنظر برسد ولی محدودیتهای ترافیکی اعلام شده در موارد خاص تابع هیچ قانون کلی نیست و با توجه به شرایط محیط، زمانی و مکانی اعلام و اعمال میشود. یک مثال وقتی ما مثلا در Sql Server اقدام به ایجاد Stored Procedures میکنیم دیگر برنامه ها اقدام به صدا کردن این Stored Procedures خواهند کرد و این کار کد داخل ان خواهد شود حا هرگاه من اقدام به تغییر logic این Stored Procedures کنم بعد از ذخیره درصورت صدا کردن این Stored Procedures توسط هر برنامه دیگری کدهای جدید اعمال خواهند شد. آیا امکان داشتن چنین قابلیتی در کنار برنامه های ++C وجود دارد؟ (برای دیگر زبانها چطور؟)
  14. kambiz behnia

    اتفاقا منظورم همان تغییر logic تابع هست. یعنی امیدی نیست. نظرتان در باره پاسخ کاربر quark چیست؟
  15. kambiz behnia

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

    اگر امکان این وجو داشته باشد تا کد helloWorld را تغییر داده و بدون نیاز به کمپایل مجدد برنامه اصلی بتوان از کد جدید استفاده کرد احتمالا پاسخگوی کارم خواهد بود.
  17. kambiz behnia

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

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

    منظور رفتار متفاوت در زمان اجرا هست ولی چون از قبل نوع عملکرد مشخص نیست و تغییرات زیاد است میخواستم به روشی بخش کمپایل مجدد کد را به شکلی حذف کنم. فکر نمیکنم مبحث تزیق کد کاربردی برایم داشته باشد. اگر درست متوجه شده باشم دات نت و جاوا برای اجرا سورس کد را به یک واسطه تبدیل و کدهای داخل آنرا اجرا میکنند حال در این حالت اگر سورس کد اصلی تغییر کند آیا دوبراره بطورخدکار آنرا کمپایل خواهند کرد در باره Dalvik چیزی نمیدانم شاید جوابم را بدهد اگر تا حدودی نزیک پاسخم بود مزاحم خواهم شد. اگر بتوان از داخل برنامه c++ از زبان پایتون استفاده کرد و دادهایی را تبادل نمود و ایتون قابلیت کمپایل (منظور همان تفسیر دوباره است ) زمان اجرا را داشته باشد احتمالا کارساز خواهد بود متشکرم
  20. kambiz behnia

    کمی گنگ بودن سوال را قبول دارم. فرض کنید دربرنامه به Sq Server وصل شده و اقدام به صدا کردن پروسیجرهایی که از قبل نوشته و در دیتابیس ذخیره شده است مکنیم. هر وقت ما اقدام به تغییر یک پروسیجر بکنیم از آن به بعد آن کد جدید هنگام صدا کردن پروسیجر اجرا خواهد شد. میخواستم مشابه این را داشته باشم. گفتم شاید کتابخانه هایی وجود داشته باشند که به کمک آنها بتوان کدهای داخل فایلی را parse کرده و دستورات آنرا اجرا کرد چیزی شبیه یک مفسر کوچک زبان که دستورات محدودی را شامل میشود. مثلا در windows میتوانیم بخشی را کد را داخل فایل dll قرار دهیم و هرگاه کد dll را عوض کرده و دوباره کمپایل کنیم و فایل dll را جایگزین فایل قبلی کنیم تغییرات جدید اعمال خواهد شد. تقریبا میخواهم مشابه این کار را انجام دهم بطوریکه لازم به کمپایل مجدد چیزی نباشد و تغییرات در حد عوض کردن یک فایل text باشد. شاید اینطوری بهتر باشد چگونه یک فایل script که حاوی کدهای است که در امکان تغییر داده های اصلی را میدهد را اجرا کنیم.
  21. فرض کنیم متدی به نام Calculate برای یکی از کلاسها درون برنامه وجود دارد و برحسب شرایطی فرا خوانی میشود. آیا راهی وجو دارد که بتوان کد داخی آنرا تغییر داد طوری که بعد از تغییر برنامه کد تغییر یافته را اجرا کند همانند proceger در sql server
  22. kambiz behnia

    احتمالا لازمه اجرا شد برنامه به روش گفته شده در بالا login شدن کاربر باشد. لطفا در مورد برنامه های که بدون login شدن کاربر بطور خودکار اجرا خواهند شد (برای محیط های مختلف توضیح دهید).
  23. kambiz behnia

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

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

    با تشکر از پاسخ بطور خلاصه نتیجه گیری خودم از پاسخ های شما را اینجا می آورم لطفا اطلاح بفرمائید. 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 مقدار جداگانه ای برای خود دارد (بعید بنظر میرسد).
×
×
  • جدید...