表现1

配置是标准,休闲模式

然后一直重复提示

select desire deck

select causal mode

表现2

配置是狂野,休闲模式

然后一直提示

切换到狂野

切换到标准

把模式切换到auto好像就可以了

[QuestPlus] You don't have the deck name 'sqs' for the class 'PALADIN'. Please correct this DeckName or re-Cache Custom Decks.

在default bot页面勾选,重新cache卡组

后面观察发现,设置Mode为Ranked,设置RuleSet为Standard。也可以正常工作,虽然最后是在狂野,休闲模式下打的。

这样的话,只会在排名模式下运行。

切换到休闲模式的话,在上面的模式运行的过程中,切换模式到休闲。

等游戏结束,或者自己stop,然后手动投降。下一局开始的时候,还是不行。

开始之后,会一直提示,不管,直接再把模式改为ranked,然后就会在休闲模式打了。

查看完整的启动流程

[Start] Now creating the BotThread.
[Stats] Start
Load settings for Control
current alpha is 0.5
set enemy-face-hp to: 15
set weaponOnlyAttackMobsUntilEnfacehp to: 0
set maxwide to: 3000
calculate the second turn of the 0 best boards
playing arround secrets is true
Control settings are loaded.
[Combo] Load combos for Control
read _combo.txt...
[Combo] 0 combos loaded successfully, 0 values loaded successfully
[RulesEngine] _rules.txt - read error. We continue without user-defined rules. Only the default rules.
[CollectionManagerScene]
[CollectionManagerScene_COLLECTION]
[CollectionManagerScene_COLLECTION] Waiting to be in this state longer.
[CollectionManagerScene]
[CollectionManagerScene_COLLECTION]
[CollectionManagerScene_COLLECTION] We have the contents of this deck already.
[DefaultBotSettings] NeedsToCacheCustomDecks = False.
[CollectionManagerScene]
[CollectionManagerScene_COLLECTION]
[CollectionManagerScene_COLLECTION] Waiting to be in this state longer.
[CollectionManagerScene]
[CollectionManagerScene_COLLECTION]
[CollectionManagerScene_COLLECTION] We do not need to cache custom decks. Now leaving the "Collection Manager".
[IsClientInUsableState] SceneMgr.IsTransitioning.
[HubScene]
[HubScene] The bot needs to cache quests. Now clicking on the "Quest Log" button.
[HubScene]
[HandleQuests]
[GameEventManagerOnQuestUpdate]
[GameEventManagerOnQuestUpdate][1176]正义凛然: 使用20张圣骑士职业牌。 (3 / 20) [50x GOLD]
[GameEventManagerOnQuestUpdate][2420]火焰节快乐!: 使用30张卡牌。 (6 / 30) [1x BOOSTER_PACK]
[HubScene] Now clicking to close the "Quest Log" screen.
[DefaultBotSettings] NeedsToCacheQuests = False.
[HubScene]
[HubScene] Now clicking on the "Play" button.
[IsClientInUsableState] SceneMgr.IsTransitioning.
[IsClientInUsableState] !SceneMgr.IsSceneLoaded.
[IsClientInUsableState] !SceneMgr.IsSceneLoaded.
[IsClientInUsableState] Box.IsBusy.
[TournamentScene]

从这里开始,就一直在切换狂野和休闲模式
[TournamentScene_DeckPicker] Now changing the game ruleset to 'Wild'.
[TournamentScene]
[TournamentScene_DeckPicker] Now changing the game ruleset to 'Wild'.
[TournamentScene]
[TournamentScene_DeckPicker] Now changing the game ruleset to 'Wild'.
[Stop] Now requesting the BotThread to stop.
[Stats] Stop
[DefaultBotSettings] ForceConcedeAtMulligan = False.

在源码中搜索Assembly-Csharper中搜索TournamentScene找到一个叫DefaultBot的类,

[TournamentScene_DeckPicker] Now changing the game ruleset

在类里面搜索ruleset

else if (DefaultBotSettings.Instance.ConstructedGameRule == GameRule.Wild){if (!@bool){flag = true;DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] Now changing the game ruleset to 'Wild'.", Array.Empty<object>());}}

方法是method_49

private async Task method_49(TournamentScene tournamentScene_0){if (DefaultBotSettings.Instance.ClientBackAttempts >= 5){DefaultBot.ilog_0.ErrorFormat("[TournamentScene_DeckPicker] The client has been detected to be in a broken state. Please restart it as soon as possible as it cannot leave the current scene.", Array.Empty<object>());DefaultBotSettings.Instance.ClientBroken = true;}GameEventManager.Instance.method_6();await Coroutine.Yield();if (!DefaultBotSettings.Instance.ClientBroken && (DefaultBotSettings.Instance.NeedsToCacheQuests || DefaultBotSettings.Instance.NeedsToCacheCustomDecks)){DefaultBotSettings.Instance.ClientBackAttempts++;DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] Now returning to the Hub to cache quests/decks.", Array.Empty<object>());TaskAwaiter taskAwaiter = this.method_50(tournamentScene_0).GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;TaskAwaiter taskAwaiter2;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);}else{GameEventManager.Instance.method_7();TaskAwaiter taskAwaiter = Coroutine.Yield().GetAwaiter();TaskAwaiter taskAwaiter2;if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);if (DefaultBotSettings.Instance.GameMode != GameMode.Constructed){if (DefaultBotSettings.Instance.ClientBroken){BotManager.Stop();DefaultBot.ilog_0.ErrorFormat("[TournamentScene_DeckPicker] Your client needs to be restarted before continuing.", Array.Empty<object>());taskAwaiter = Coroutine.Yield().GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);}else{DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] Now returning to the Hub to change the game type.", Array.Empty<object>());taskAwaiter = this.method_50(tournamentScene_0).GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);}}else{DeckPickerTrayDisplay deckPickerTrayDisplay = DeckPickerTrayDisplay.Get();if (deckPickerTrayDisplay == null){DefaultBot.ilog_0.DebugFormat("[TournamentScene_DeckPicker] DeckPickerTrayDisplay is null", Array.Empty<object>());}else if (!deckPickerTrayDisplay.IsLoaded()){DefaultBot.ilog_0.DebugFormat("[TournamentScene_DeckPicker] !DeckPickerTrayDisplay.IsLoaded", Array.Empty<object>());}else if (string.IsNullOrEmpty(DefaultBotSettings.Instance.ConstructedCustomDeck)){DefaultBot.ilog_0.ErrorFormat("[TournamentScene_DeckPicker] Please type a name for ConstructedCustomDeck!", Array.Empty<object>());BotManager.Stop();taskAwaiter = Coroutine.Yield().GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);}else{bool @bool = Options.Get().GetBool(Option.IN_WILD_MODE);bool flag = false;if (DefaultBotSettings.Instance.ConstructedGameRule == GameRule.Auto){CustomDeckCache customDeckCache = MainSettings.Instance.CustomDecks.FirstOrDefault(new Func<CustomDeckCache, bool>(DefaultBot.Class224.<>9.method_2));if (customDeckCache != null){if (customDeckCache.IsWild){if (!@bool){flag = true;}}else if (@bool){flag = true;}}}else if (DefaultBotSettings.Instance.ConstructedGameRule == GameRule.Wild){if (!@bool){flag = true;DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] Now changing the game ruleset to 'Wild'.", Array.Empty<object>());}}else{if (DefaultBotSettings.Instance.ConstructedGameRule != GameRule.Standard){DefaultBot.ilog_0.ErrorFormat("[TournamentScene_DeckPicker] Unprocessed ConstructedGameRule: {0}.", DefaultBotSettings.Instance.ConstructedGameRule);BotManager.Stop();taskAwaiter = Coroutine.Yield().GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);return;}if (@bool){flag = true;DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] Now changing the game ruleset to 'Standard'.", Array.Empty<object>());}}if (flag){Client.LeftClickAt(deckPickerTrayDisplay.m_switchFormatButton.Transform.Position);taskAwaiter = Coroutine.Sleep(1500).GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);}else{List<CustomDeckPage> customPages = deckPickerTrayDisplay.m_customPages;if (customPages != null){using (List<CustomDeckPage>.Enumerator enumerator = customPages.GetEnumerator()){while (enumerator.MoveNext()){if (!enumerator.Current.AreAllCustomDecksReady()){DefaultBot.ilog_0.DebugFormat("[TournamentScene_DeckPicker] !AreAllCustomDecksReady", Array.Empty<object>());await Coroutine.Sleep(1000);return;}}}List<CustomDeckPage>.Enumerator enumerator = default(List<CustomDeckPage>.Enumerator);DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] Now attempting to select the desired custom deck.", Array.Empty<object>());if (!(await DefaultBot.smethod_5("TournamentScene_DeckPicker", deckPickerTrayDisplay.m_selectedCustomDeckBox, customPages, deckPickerTrayDisplay, DefaultBotSettings.Instance.ConstructedCustomDeck))){DefaultBotSettings.Instance.NeedsToCacheQuests = true;return;}}else{DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] Now attempting to select the desired basic deck.", Array.Empty<object>());TaskAwaiter<bool> taskAwaiter3 = DefaultBot.smethod_4("TournamentScene_DeckPicker", deckPickerTrayDisplay.m_selectedHeroButton, deckPickerTrayDisplay.m_heroButtons, deckPickerTrayDisplay, DefaultBotSettings.Instance.ConstructedCustomDeck).GetAwaiter();if (!taskAwaiter3.IsCompleted){await taskAwaiter3;TaskAwaiter<bool> taskAwaiter4;taskAwaiter3 = taskAwaiter4;taskAwaiter4 = default(TaskAwaiter<bool>);}bool result = taskAwaiter3.GetResult();taskAwaiter3 = default(TaskAwaiter<bool>);if (!result){DefaultBotSettings.Instance.NeedsToCacheQuests = true;return;}}if (deckPickerTrayDisplay.m_rankedPlayButtons == null){DefaultBot.ilog_0.DebugFormat("[TournamentScene_DeckPicker] DeckPickerTrayDisplay.m_rankedPlayButtons == null.", Array.Empty<object>());}else{bool bool2 = Options.Get().GetBool(Option.IN_RANKED_PLAY_MODE);if (DefaultBotSettings.Instance.ConstructedMode == ConstructedMode.Casual){if (bool2){DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] Now changing to \"Casual\" constructed.", Array.Empty<object>());Client.LeftClickAt(deckPickerTrayDisplay.m_rankedPlayButtons.m_casualButton.Transform.Position);taskAwaiter = Coroutine.Sleep(1500).GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);return;}}else{if (DefaultBotSettings.Instance.ConstructedMode != ConstructedMode.Ranked){DefaultBot.ilog_0.ErrorFormat("[TournamentScene_DeckPicker] Unprocessed ConstructedMode: {0}.", DefaultBotSettings.Instance.ConstructedMode);BotManager.Stop();taskAwaiter = Coroutine.Yield().GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);return;}if (!bool2){DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] Now changing to \"Ranked\" constructed.", Array.Empty<object>());Client.LeftClickAt(deckPickerTrayDisplay.m_rankedPlayButtons.m_rankedButton.Transform.Position);taskAwaiter = Coroutine.Sleep(1500).GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);return;}}DefaultBotSettings.Instance.ClientBackAttempts = 0;TransitionPopup transitionPopup = GameMgr.Get().m_transitionPopup;if (transitionPopup != null && transitionPopup.IsShown()){DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] The \"Matching\" popup is showing.", Array.Empty<object>());taskAwaiter = Coroutine.Sleep(1000).GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);}else{PlayButton playButton = deckPickerTrayDisplay.m_playButton;UberText newPlayButtonText = playButton.m_newPlayButtonText;if (!playButton.IsEnabled()){DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] The \"{0}\" is not enabled.", newPlayButtonText.Text);}else{UberText newPlayButtonText2 = playButton.m_newPlayButtonText;Vector3 center = newPlayButtonText2.m_TextMeshGameObject.Renderer.Bounds.m_Center;DefaultBot.ilog_0.InfoFormat("[TournamentScene_DeckPicker] Now clicking the \"{0}\" button.", newPlayButtonText2.Text);Client.LeftClickAt(center);taskAwaiter = Coroutine.Sleep(3000).GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);}}}}}}}}

analyze

Triton.Bot.Logic.Bots.DefaultBot.DefaultBot.method_49(TournamentScene) : Task @060013A0
Used By
Triton.Bot.Logic.Bots.DefaultBot.DefaultBot.method_48(TournamentScene) : Task @0600139F
Used By
Triton.Bot.Logic.Bots.DefaultBot.DefaultBot.method_21() : Task @06001384
Used By
Triton.Bot.Logic.Bots.DefaultBot.DefaultBot.method_17() : void @0600137D
Triton.Bot.Logic.Bots.DefaultBot.DefaultBot.Start() : void @0600137A

从DefaultBot.method_17()开始的调用

private void method_17(){this.coroutine_0.Dispose();this.coroutine_0 = new Coroutine(new Func<Task>(this.method_54));}

    [CompilerGenerated]private Task method_54(){return this.method_21();}

从DefaultBot.Start()开始的调用

public void Start(){this.coroutine_0 = new Coroutine(new Func<Task>(this.method_53));this.bool_2 = false;GameEventManager.Instance.Start();PluginManager.Start();RoutineManager.Start();ProcessHookManager.Enable();GameEventManager.NewGame += this.method_18;GameEventManager.GameOver += this.method_19;GameEventManager.MulliganConfirm += this.method_16;InactivePlayerKicker inactivePlayerKicker = InactivePlayerKicker.Get();if (inactivePlayerKicker != null){inactivePlayerKicker.SetShouldCheckForInactivity(false);}}

[CompilerGenerated]private Task method_53(){return this.method_21();}

从DefaultBot.method_21()开始的调用

private Task method_21(){DefaultBot.Struct60 @struct;@struct.defaultBot_0 = this;@struct.asyncTaskMethodBuilder_0 = AsyncTaskMethodBuilder.Create();@struct.int_0 = -1;AsyncTaskMethodBuilder asyncTaskMethodBuilder_ = @struct.asyncTaskMethodBuilder_0;asyncTaskMethodBuilder_.Start<DefaultBot.Struct60>(ref @struct);return @struct.asyncTaskMethodBuilder_0.Task;}

不太明白method_21是怎么调用method_48的,查看代码的话,只是使用了this。

查看DefaultBot的类,发现有继承关系

public class DefaultBot : IRunnable, IAuthored, IBase, IBot, IConfigurable

猜测是因为继承了IRunnable,所以还有其他逻辑在进行启动

public interface IRunnable{// Token: 0x06001162 RID: 4450void Start();// Token: 0x06001163 RID: 4451void Tick();// Token: 0x06001164 RID: 4452void Stop();}

可以考虑查看start方法,usedby哪些类

AsyncTaskMethodBuilder在这里的使用,说明源码里面使用了async关键字进行异步编程,

可以看下面这篇文章里面的分析

C# Under the Hood: async/await

ILSpy好像可以正常反编译async

https://github.com/0xd4d/dnSpy/issues/687#issuecomment-354990427

await is just synthetic sugar for what you see in the decompiled code. Usually ILSpy converts this back to what a programmer would normally write, but the version that dnSpy uses didn't have that implemented yet. You can find all implemented language features for the latest version of ILSpy here, but keep in mind that dnSpy still uses ILSpy 2.x, not 3.x.

奇怪的是,上面的method_49是正常识别了async的语法的,不知道为什么method_21无法识别

private async Task method_48(TournamentScene tournamentScene_0){DefaultBot.ilog_0.InfoFormat("[TournamentScene]", Array.Empty<object>());if (!tournamentScene_0.IsLoaded()){DefaultBot.ilog_0.DebugFormat("[TournamentScene] !TournamentScene.IsLoaded.", Array.Empty<object>());}else if (!tournamentScene_0.m_deckPickerIsLoaded){DefaultBot.ilog_0.DebugFormat("[TournamentScene] !m_deckPickerIsLoaded.", Array.Empty<object>());}else{PresenceMgr presenceMgr = PresenceMgr.Get();if (presenceMgr == null){DefaultBot.ilog_0.DebugFormat("[TournamentScene] PresenceMgr is null.", Array.Empty<object>());}else{List<MonoEnum> statusEnums = presenceMgr.GetStatusEnums(BnetPresenceMgr.Get().GetMyPlayer());if (statusEnums != null && statusEnums.Count != 0){foreach (MonoEnum monoEnum in statusEnums){PresenceStatus presenceStatus = monoEnum.AsEnum<PresenceStatus>();TritonHs.smethod_4(presenceMgr, ref presenceStatus);if (presenceStatus == PresenceStatus.PLAY_DECKPICKER){TaskAwaiter taskAwaiter = this.method_49(tournamentScene_0).GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;TaskAwaiter taskAwaiter2;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);}else if (presenceStatus == PresenceStatus.PLAY_QUEUE){TaskAwaiter taskAwaiter = this.method_51(tournamentScene_0).GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;TaskAwaiter taskAwaiter2;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);}else{TaskAwaiter taskAwaiter;TaskAwaiter taskAwaiter2;if (presenceStatus != PresenceStatus.HUB){DefaultBot.ilog_0.ErrorFormat("[TournamentScene] Unhandled presence status detected: {0}. Please restart your client and try again. If the error is still not fixed, please report this message.", monoEnum);BotManager.Stop();taskAwaiter = Coroutine.Yield().GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);return;}DefaultBot.ilog_0.DebugFormat("[TournamentScene] Presence status [{0}] detected. Now waiting for it to update.", monoEnum);taskAwaiter = Coroutine.Sleep(5000).GetAwaiter();if (!taskAwaiter.IsCompleted){await taskAwaiter;taskAwaiter = taskAwaiter2;taskAwaiter2 = default(TaskAwaiter);}taskAwaiter.GetResult();taskAwaiter = default(TaskAwaiter);}monoEnum = null;}List<MonoEnum>.Enumerator enumerator = default(List<MonoEnum>.Enumerator);}else{DefaultBot.ilog_0.DebugFormat("[TournamentScene] PresenceMgr.GetStatus is null or empty.", Array.Empty<object>());}}}}

TaskAwaiter taskAwaiter = this.method_49(tournamentScene_0).GetAwaiter();

上面这段代码,应该是调用method_49的

转载于:https://www.cnblogs.com/chucklu/p/11184577.html

HearthBuddy的狂野和休闲模式来回切换相关推荐

  1. 视频直播系统源码,平台在日间和夜间模式之间来回切换

    视频直播系统源码,平台在日间和夜间模式之间来回切换实现的相关代码 import 'package:flutter/material.dart'; import 'package:flutter_wid ...

  2. csgo 机器人模式_分享一个休闲模式机器人Bug

    1热身模式进的早还有机器人的时候 疯狂M1 M2 M1 M2切换队伍 可以把房间迅速用机器人充填到10V10 机器人会被后来进来的玩家顶替 2自己死后(或者自杀)以后 可以变到对面按E控制机器人 然后 ...

  3. python-spyder光标在覆盖字符和插入模式间切换

    方法 有时候打字不小心,光标从字符间的插入模式变为了覆盖字符模式,使用insert键就能改回来,有独立数字键盘的情况下直接shift+0就能来回切换了 insert键功能 鼠标点击可输入框后会出现闪动 ...

  4. CentOS下命令行和桌面模式的切换方法

    2019独角兽企业重金招聘Python工程师标准>>> CentOS下命令行和桌面模式的切换方法 CentOS终于下载安装完成了,安装方法请看 CentOS 6.0 图文安装教程(D ...

  5. [鸟哥的Linux私房菜] X Window 与 纯文本模式的切换

    1.  X Window下重启(注销+重新登录) Alt + Ctrl + Backspace 2. X Window与命令行模式的切换 Ctrl + Alt + F1 ~ F6 :文字界面登录 tt ...

  6. 电脑快捷键横屏变竖屏,电脑显示器竖屏横屏来回切换怎么设置

    对于横屏与竖屏来回切换,很多小伙伴使用可能很不习惯,那如何在横屏与竖屏之间来回快速切换呢?下面是小编为大家介绍电脑显示器竖屏横屏来回切换的设置方法,欢迎大家阅读. 电脑显示器竖屏横屏来回切换的设置方法 ...

  7. android 简单的音乐播放器实现播放模式的切换

    以前写过一篇简单的音乐播放器,但是这个播放器没有实现播放模式的切换,在项目中要实现两个播放模式,循环播放和随机播放,经过这两天的努力搞定了,界面比较粗糙.可以先看一下前面的简单音乐播放器,详细的就不说 ...

  8. dg oracle 切换模式_Oracle数据库 DGbroker三种保护模式的切换

    1.三种保护模式 – Maximum protection 在Maximum protection下, 可以保证从库和主库数据完全一样,做到zero data loss.事务同时在主从两边提交完成,才 ...

  9. oracle dg apply lag,Oracle数据库 DGbroker三种保护模式的切换

    1.三种保护模式 – Maximum protection 在Maximum protection下, 可以保证从库和主库数据完全一样,做到zero data loss.事务同时在主从两边提交完成,才 ...

最新文章

  1. vmware linux系统 ip,修改虚拟机上Linux系统的IP地址
  2. TaskIcon 系统任务栏图标
  3. java 位运算符在实际开发中的用处_java 位运算 和实际应用
  4. fileziller 恢复 站点管理器 内的ftp帐号方法
  5. 新网邮箱手机服务器,使用qq邮箱进行服务器邮件代发
  6. 【机器人】关于驱动器与控制器的工作机制
  7. mysql基本sql语句总结(二)
  8. java实现验证码生成工具类
  9. 学习用于视觉跟踪的深度紧凑图像表示Learning a Deep Compact Image Representation for Visual Tracking
  10. oracle优化distinct,oracle 索引优化之distinct
  11. Intel服务器芯片组区别,不同芯片组的主板有什么区别?
  12. Shake Shack新店推出专为狗狗研制的冰激凌;素食“鱼肉”三明治挑战赛百味;植物肉品牌v2登陆中国市场...
  13. 你的Web系统真的安全吗?
  14. Python爬取并分析 201865 条《隐秘的角落》弹幕
  15. Maple: 矩阵转置
  16. 工程师的浪漫:用机械臂画一个爱心
  17. 说说org.json.JSONObject功能和源码(二)
  18. python万里长征2(非教)
  19. 在UMAP图上标识我们感兴趣的基因所在的类群(单细胞数据)
  20. Java实现蜘蛛纸牌

热门文章

  1. 2006中国互联网大嘴经典语录TOP10
  2. python青蛙跳台阶_Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
  3. 第143章 SQL函数 TO_DATE(一)
  4. 微软3D Movie Maker开源
  5. 魔众短链接系统 v3.3.0 常规优化升级 系统更稳定
  6. intellij idea的Browse repositories无法搜索安装插件?
  7. 400交换机呼叫中心的知识
  8. 接口ApplicationContext中的getBean()方法的详解
  9. 关于LBD线特征匹配算法运行
  10. 新迅随身wifi助手刷机root安装面具安装debian折腾