Master & Slave

9up

Active Member
آقا سلام
یه برنامه اصلی (Main) هست که وقتی اجرا شد یه برنامه کوچیکه دیگه رو اجرا میکنه. (هر دوی این برنامه ها با mmb ساخته شدند)
حالا تو این برنامه ی Main دو تا دکمه (Button) داریم که با زدن هر کدوم از دکمه ها عکسی توی اون برنامه کوچیکه نشون داده بشه. (مثلا وقتی دکمه ی اولی رو می زنیم عکسی از شهر تهران و کلید دومی عکس شیراز رو نشون بده)
سوال اصلی من ارتباط بین دو فایل exe که هر دو توسط mmb ساخته شدند، هست! نه صرفا نشان دادن عکس.
آیا چنین چیزی امکان داره!؟
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
راه حل اول: ارتباط بوسیله ی Command-Line:

شما میتونید پارامترهایی به برنامه بفرستید (هرکدوم از این دو) و در برنامه ی مقصد تعرف کنید که اگر فلان پارامتر رو دریافت کردی، یک کار خاص انجام بده
در این روش نیاز هست که هنگام کامپایل تیک مربوط به Allow only one instance رو بزنید، تا وقتی پارامتر به برنامه ارسال شد، دوباره اجرا نشه و پنجره ی جدید باز نشه.
برای این مورد CMDLine رو در انجمن یا راهنمای MMB و یا کتاب جامع MMB جستجو کنید

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

روش سوم: شما میتونید توسط ابزارهای واسطه اسکریپت های MMB رو مستقیماً در برنامه ی دوم اجرا کنید
اینکار رو توسط زبان های برنامه نویسی میتونید انجام بدید، یعنی یک واسط بنویسید که دستورات و کدهای موردنظر شما رو دریافت کنه، و اون رو در برنامه ی مقصد اجرا کنه.
قبلاً یک مثال برای این مورد ساخته بودم که ابزار واسطه توسط برنامه ی AutoIt نوشته و کامپایل شده بود
متاسفانه الان فرصتش رو ندارم لینک اون مبحث رو براتون پیدا کنم، انجمن رو برای پست های بنده که در اون عبارت autoit وجود داره جستجو کنید.
اون ابزار برای ارسال کدها نیاز داره که Title برنامه ی شما رو بدونه (تا بتونه هندل رو بدست بیاره)

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

9up

Active Member
با سلام مجدد
ظاهرا این برنامه ی AutoIt دقیقاً همون چیزیه که من میخوام!
تو فروم برای این کلمه در پست های شما جستجو کردم. یه نمونه هم پیدا کردم که توی فایل زیپ 4 تا فایل هست به نام های
MMBLib.au3
Send Code.mbd
SendCode.au3
SendCode.exe
وقتی فایل exe رو اجرا می کنم چنین اروری رو میده:
Missing CMDLine parameters!
حالا من نمیدونم چیکار کنم.
توی فایل mbd هم که فقط یه دکمه هست و که اونم نمیدونم چیکار میکنه.
لطفاً راهنمایی کنید.
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
اگر با روش اول (Command-Line) مشکلی ندارید من اون رو پیشنهاد میکنم

ولی به هرحال، تو اون مثال من اشتباهاً مسیر فایل exe رو تغییر نداده بودم، مسیر رو به فایل send.exe که تو بسته هست تغییر بدید (مثلاً Embedded ش کنید)

اون برنامه رو اگه روش دابل کلیک کنید کدها رو اجرا نمیکنه چون باید هنگام اجرا براش پارامتر ارسال کنید
این برنامه دوتا پرامتر میگیره، اولی تیتر (Title) پنجره ی برنامه ی مقصد هست
و دومی کدی که نیاز هست اجرا بشه (تو اون مثال ()NextPage بود)

تستش کنید متوجه میشید.

برای اینکه دردسرتون کمتر بشه (برای کدهای پیچیده تر) توصیه میکنم در MMB مثلاً به روش Base64 (پلاگین SQLite این متد رو داره) کدها رو انکریپت (کدگذاری) کنید و در برنامه ی AutoIt اون کدها رو با روش Base64 دیکریپت کنید، ازین جهت عرض میکنم که یک کد MMB حاوی کاراکترهای مختلفی مثل ' و " هست که براتون دردسر ایجاد میکنه
 

9up

Active Member
دادش دمت گرم
بسیار عالی بود
کلی باهاش ور رفتم آخرش فهمیدم چقدر آسون بود
البته اگه شما راهمایی نمیکردی دست نیافتنی بود!

خوب
یه سوال دیگه
من با این مثال تو پروژه ی خودم تونستم تکست رو به یه پروژه دیگه پاس بدم
و توی یه editBox و یا Listbox نمایش بدمش.
اینجا مشکلی نیست.
فقط اینکه من مثلاٌ می خوام یه پرامتر مثل "A01" بفرستم به یه برنامه دیگه
فرستادن که مشکلی نیست
نمایش اون هم مشکلی نیست
حالا من نمی خوام نشون داده بشه!
چرا؟
برای اینکه وقتی برنامه دومی این کد رو خوند یه کاریو انجام بده مثلا یه عکس و نشون بده
همین
تو دستور if نمیدونم چطوری این پارامتر رو بخونم و درباره اش تصمیم گیری کنم
امیدوارم منظورزم و خوب رسونده باشم
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
من الان دقیقاً متوجه نشدم که شما از روش Command-Line استفاده کردید یا اون برنامه ی AutoIt

اگر از Command-Line استفاده کردید که حتماً اطلاع دارید که پارامترهای دریافتی در یک آرایه ذخیره میشن
فرض میکنیم اولین پارامتر که در متغیر [1]$CMDLineParam ذخیره میشه، همون "A01" هست، خب شما با یه شرط ساده چک میکنید، که اگر پارامتر همون بود، مثلاً فلان کار رو انجام بده:
کد:
[color=#009000]** CmdLineParam$[0] holds number of passed cmd line parameters[/color] 
n = [color=#000090][b]VAL[/b][/color](CmdLineParam$[[color=#ff0000]0[/color]]) 
[color=#009000]** if number of parameters is > 0 then...[/color] 
[color=#0000FF]If[/color] (n > [color=#ff0000]0[/color]) [color=#0000FF]Then[/color] 
  [color=#0000FF]If[/color] (CmdLineParam$[[color=#ff0000]1[/color]] = [color=#800000]'A01'[/color]) [color=#0000FF]Then[/color] 
    [color=#009000]**// Do Something[/color] 
  [color=#0000FF]End[/color] 
[color=#0000FF]End[/color]


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

در هرمورد سوالی داشتید بفرمایید
 

9up

Active Member
والا من که نتونستم با Autoit کار کنم
فعلا همی CMDLine کارم و راه انداخته
فقط یه مشکلی هست
اینکه وقتی یه کد ارسال شد و گیرنده این کد رو خوند و یه کاری انجام داد، دائماً این عمل انجام میشه.
یعنی اینکه وقتی شرط گذاشتی که اگه کد "A01" اومد این کارو انام بده، تا زمانی که این کد عوض نشه همین کارو انجام میده.
حالا می خوام تو نوشتن یه فیلترینگ بهم کمک کنید.
یعنی اینکه بعد از اینکه اون کد مورد نظر ارسال شد، 200ms تاخیر ایجاد بشه و یه کد الکی ایجاد بشه که اصلا تو برنامه دومی تعریف شده نباشه.
 

nevercom

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

شما باید در صفحه ی اول یا MasterPage/Master Top Layer یک اسکریپت ایجاد کنید و نامش رو بزارید CBK_CMDLINE (همه حروف بزرگ، تست نکردم ببینم ایراد میگیره با حروف کوچک یا نه :wink: )
حالا کدهاتون رو در این اسکریپت قرار بدید، به محض اینکه پارامتری ارسال بشه، اسکریپت خودبخود اجرا میشه و عکلیات پردازش صورت میگیره.

فقط متوجه نشدم سوال دومتون چیه، یعنی چی کاری انجام بده که در برنامه ی دوم اصلاً تعریف نشده باشه ؟
اگر منظورتون یک کد MMB هست، بله میتونید کد رو ارسال کنید و توسط دستور RunScriptCode اجراش کنید، اما اصلاً ایده ی خوبی نیست، حداقل تا زمانی که داده ها رو کدگذاری نشده بفرستید، چون معنیش اینه که هرکسی میتونه اسکریپت های MMB رو در برنامه ی شما اجرا کنه.
 

9up

Active Member
اول از همه یه تشکر ویژه برای شما دوست عزیز که واقعاً وقت میزاری و کمک میکنی
ایشالا هر چی می خوای بدست بیاری
قبل از اینکه به فکر دو قسمتی کردن برنامه بیفتم، برنامه شامل یک قسمت بود (فقط یک فایل exe) که یه تعداد تقریباً زیادی Button هم داشت. تعدادی از این Buttonها هم MultiClick (نمیدونم این اصطلاح درسته یا نه) بودن، یعنی هر بار که فشار میدادی یه کاری انجام می داد. مثلا با اولین فشار یک عکس رو نشون می داد و با دومین فشار اون عکس رو Hide میکرد و بعضیای دیگه که 3 یا 4 کار انجام می دادند.

حالا مشکل من اینه که وقتی یک کد رو از اون برنامه دریافت میکنم، توی اون CBK_CMDLINEای که تو برنامه تعریف کردم یه سری شرط گذاشتم که اگه فلان کد رو دریافت کردی این کار رو انجام بده.
یعنی تو برنامه یک Script مستمرا اجرا میشه و عمل Hide و Show رو تکرار میکنه.
خوب برنامه درست کار میکنه و تا زمانی که کد از برنامه Transmitter عوض و ارسال نشده همچنان شرط برقراره و این عمل رو در برنامه گیرنده مستمر انجام میده.
می خوام یه جوری بشه که وقتی با برنامه ی Transmitter (همونی که کد رو میفرسته) وقتی روی دکمه ی Pass Code رو زدم اون کد رو بفرسته و بعد از چند میلی ثانیه مقدار اون کد رو عوض کنه و دوباره بفرسته.
اینجوری تو برنامه ی گینده یک لحظه شرط برقرار میشه و کار مورد نظر انجام میشه و دیگه تغییر نمیکنه تا دوباره کد ارسال بشه.

این کد برنامه گیرنده:
کد:
n=[color=#000090][b]VAL[/b][/color](CmdLineParam$[[color=#ff0000]0[/color]]) 
[color=#0000FF]If[/color] (n>[color=#ff0000]0[/color]) [color=#0000FF]Then[/color] 
  [color=#0000FF]For[/color] i=[color=#ff0000]1[/color] [color=#0000FF]To[/color] n 
    [color=#000090][b]DisplayValue[/b][/color]("Text1","CmdLineParam$[[color=#ff0000]1[/color]]") 
    [color=#000090][b]DisplayValue[/b][/color]("Text2","CmdLineParam$[[color=#ff0000]2[/color]]") 
    [color=#000090][b]DisplayValue[/b][/color]("Text9","CmdLineParam$[[color=#ff0000]3[/color]]") 
    [color=#000090][b]LoadText[/b][/color]("Text9","CmdLineParam$[[color=#ff0000]3[/color]]") 
  [color=#0000FF]Next[/color] i 
[color=#0000FF]End[/color] 
[color=#009000]**//************************[/color] 
[color=#0000FF]If[/color] (CmdLineParam$[[color=#ff0000]3[/color]] = [color=#800000]'A01'[/color]) [color=#0000FF]Then[/color] 
  [color=#000090][b]RunScript[/b][/color]("Bottom ScoreBoard") 
[color=#0000FF]End[/color] 
[color=#000090][b]ScriptTimer[/b][/color]("CBK_CMDLINE","[color=#ff0000]500[/color]")


فرستنده:
کد:
Path$=[color=#800000]'<SrcDir>\Receiver.exe'[/color] 
[color=#0000FF]If[/color] (OpenFile$ <> [color=#800000]''[/color]) [color=#0000FF]Then[/color] 
  Params$ = [color=#800000]' '[/color] + FirstParam$ + [color=#800000]' '[/color] + SecParam$ + [color=#800000]' '[/color] + [color=#800000]'"'[/color] + ThirdParam$ + [color=#800000]'"'[/color] 
  [color=#000090][b]Run[/b][/color]("Path$","Params$") 
  [color=#009000]**Pause("100")[/color] 
[color=#0000FF]End[/color]


با تشکر
 
آخرین ویرایش توسط مدیر:

nevercom

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

طبق این کد شما پارامتر رو دریافت میکنید و بر اساس اون اسکریپتی رو اجرا میکنید، اما چون هر 500 میلی ثانیه اسکریپت cbk_cmdline رو دوباره اجرا میکنید، باز همون کد اجرا میشه.

نباید اسکریپت رو دوباره صدا بزنید
اون خط رو حذف کنید و ببینید نتیجه همونه که میخاید ؟
 
  • Like
Reactions: 9up

9up

Active Member
آقا درست شد
من فکر می کردم که تو یه دوره زمانی باید اون اسکریپت رو چک کنم تا داده های جدید رو بخونم ولی دیدم که بدون چک کردن هم داده خودش خونده میشه و نیاز به چک نداره.
واقعا ممنون از رهنماییت.
خداکنه از الین سوال پرسیدنم ناراحت نشی
میشه چندتا کلید تعبیه کرد که با فشار دادن هر کدوم یک کد ارسال بشه!؟
الان تو اسکریپت بالا 3 تا کد رو با هم ارسال می کنه
می خوام وقتی یک کلید رو می زنی فقط یک کد ارسال بشه
ببخشید دیگه
شرمنده ام به خدا
خیلی ازیتت کردم
 

9up

Active Member
تست می کنم به خدا ولی به نتیجه ی دلخواه نمیرسم
خواهش میکنم کمکم کن همینطور که تا الان دریغ نکردی

28 تا Button داریم که لیبل اونها به ترتیب از A تا Z است.
می خوام وقتی کلید A رو زدیم حرف A ارسال بشه و کلید B حرف B ارسال بشه و الی آخر تا Z.
شما منت رو سر ما بزار از کلید A تا C رو برام اسکریپتشو بزار.
اسکریپت خوندنش هم زحمت بکش بزار.
دیگه شرمنده به خدا
قول میدم دیگه سوال نکنم از شما چون خیلی ازیتیت کردم
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
خب فرستادن رو که بلدید، روی هر دکمه با دستور Run برنامه رو با پارامتر اجرا کنید

در برنامه ی مقصد هم مثل قبل هست، برای هر حالت یک If بگذارید، این ساده ترین روش هست.
 
  • Like
Reactions: 9up

9up

Active Member
با سلام مجدد
این پروژه رو ساختم ولی یه مشکلی داره!
هر بار که کلیدی از برنامه ی اصلی فشار داده میشه تا یک پارامتر ارسال کنه دوباره برنامه Run میشه.
هم تو فرستنده و هم تو گیرنده تیک allow only one instance رو هم زدم،
کافیه طرف یک دقیقه با برنامه کار کنه و بعد بره تو پروسس اکسپلورر و نگاه کنه متوجه میشه چه خبره!
طرف باید 2-3 ساعت مداوم با این نرم افزار کنه و هنگ هم نکنه.
البته الان هنگ نمیکنه ها ولی اگه 10 دقیقه (البته زمان نگرفتم) با اون کار کنه فکر کنم هنگ میکنه.
تازه اگرم برنامه رو ببنده و دوباره بخواد اجراش کنه اون قسمت دومش که با پرامتر اجرا میشه، اجرا نمیشه! چرا!؟ چون چون همچنان تعداد زیادی از اون فایل exe داره پردازش میشه!
یعنی باید سیستم رو ریست کنه یا اینکه اون فایل ها kill Proccess کنه.

یه عکس از پروسس اکسپلورر گذاشتم.

چیکار کنم حالا من؟!؟!

یه راه حلی، دستوری، چیزی اگه هست بگید تا این مشکل حل شه!

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

پیوست ها

  • Process.png
    Process.png
    194.9 کیلوبایت · بازدیدها: 13
آخرین ویرایش:

جدیدترین ارسال ها

بالا