red5.jar下载1.0.1如何使用?还有就是red5.jar下载点install里面什么也没有啊 求大神啊!!!!!!

ubuntu12.04server下red51.0.0RC1的部署
一、搭建环境
Linux版本:ubuntu12.04sever&&64位
Java&&版本:Java&1.7(jdk+jre)
Red5&版本:red5-1.0.0-RC1
二、安装JDK
下载jdk-7u45-linux-x64.tar.gz文件,解压该文件,命令为:
&tar&&&-zxvf&&jdk-7u45-linux-x64.tar.gz&,解压后得到&jdk1.7.0_45文件夹,将其移到&/usr/文件夹下,命令为:
&&&&&sudo&&&mv&&&jdk1.7.0_45&&/usr/jdk1.7.0_45&&.
然后配置环境变量;
sudo&&vi&&/etc/profile
在结尾处输入:
&&&&&&&JAVA_HOME=/usr/jdk1.7.0_45
&&&& &export&JRE_HOME=/usr/jdk1.7.0_45/jre
&&&&& export&CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
&&&&& export&PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
Ubuntu&中修改默认jdk:
update-alternatives&--install&/usr/bin/java&java&/usr/java-jdk/bin/java&300
update-alternatives&--install&/usr/bin/javac&javac&/usr/java-jdk/bin/javac&300
将安装的jdk加入java选单:
update-alternatives&--config&java
检查是否成功安装,命令为:&java&&&-version,如果能看到java的相应版本,说明成功安装。
三、安装red5服务器
下载&red5-1.0.0-RC1.tar.gz&文件,解压该文件,命令为:
&tar&&&-zxvf&&red5-1.0.0-RC1.tar.gz&,得到red5-1.0.0文件夹,将其移动到&/usr/文件夹下,命令为:sudo&&&mv&&red5-1.0.0&&/usr/red5-1.0.0&&.
四、启动&red5&
进入red5&目录下:&cd&&/usr/red5-1.0.0&,执行&red5.sh&:
./red5.sh&,至此red5启动成功。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
Linux下Redis的部署和启动 下载安装介质 Redis官网地址:http://www.redis.io/目前最新版本是redis-3.0.3. 可以访问 http://download.redis.io/releases/redis-3.0.3.tar.gz 下载后使用SCP上传到服务器, 或者直接下载: wget http://download.re ...
一.软件下载 1. Tomcat7 : http://tomcat.apache.org/download-70.cgi (tar.gz) 2. JKD:/technetwork/java/javase/downloads/index.html (最新版本为JDK 6 Update 22) 二.软件安装和配置 1.安 ...
前面已经做好了apache+jdk+mysql+php+tomcat的安装.下面就开始作tomcat7.0+apache2.2的整合了 第一步是下载和编译mod_jk.so 这个连接tomcat和apache.的连接文件. 照样也是在http://tomcat.apache.org 这个网站上下载的源代码安装包:tomcat-connectors-1.2.2 ...
1.首先是Tomcat的获取 获取当然得上Apache的官方网站下载,开源免费,而且带宽也足够.下载会很快. 这是两种不同的下载,一个是普通.exe安装版本,一个是.zip解压安装版本.使用起来是一样的,只是在普通安装版本中有一些界面可提供对Tomcat的快捷设置,而且普通安装会将Tomcat作为系统服务进行注册. 2.Tomcat的运行环境搭建 a.安装J ...
1.初始化编译环境 (1)软件需求: Python 2.5 -- 2.7, which you can download from python.org. GNU Make 3.81 -- 3.82, which you can download from gnu.org, JDK 6 if you wish to build Gingerbread or
1.下载red5-war-1.0-RC1.zip
解压之得到 ROOT.war 文件.
2.处理tomcat.
下载apache-tomcat-6.0.35-windows-x86.zip包,解压到你想放在的目录下, 打开apache-tomcat-6.0.35,删除work文件夹,删除conf文件夹下的catalina相关的所有文件,打开w ...
[Android]Ubuntu12.04 下编译和下载 Android4.0.3 源码 原创文章,谢绝转载 官方页面 : initialize -& /source/initializing.html download -& /source/dow ...
操作系统:Ubuntu12.04 32位(本文也适用于64位)硬件环境:Lenove G450显卡型号:Nvidia GeForce G210
参考了网上不少文章,但由于Ubuntu12.04与以往版本的区别,所以有一部分方法不可行,下面的步骤经过本人测试,安装成功.首先在Nvidia官方网站上下载cuda5.0安装文件并且最好放在英文目录下, ...<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&CentOS 6.2 安装并配置Red5流媒体服务器(经过自己亲身验证)_centos_ThinkSAAS
CentOS 6.2 安装并配置Red5流媒体服务器(经过自己亲身验证)
CentOS 6.2 安装并配置Red5流媒体服务器(经过自己亲身验证)
CentOS 6.2下安装并配置Red5流媒体服务器 环境说明
步骤1 卸载自带的OpenJDK,具体方法,百度上有很多。建议使用yum –y remove方式
步骤2 安装Sun JDK1.6,具体方法,百度上有很多
步骤3 安装Red5(重点)
1、下载red5并解压到/usr/local/red5目录
cd /usr/local/red5./red5.sh 如果最后一行显示:Installer service created,则说明安装成功了。此时可ctrl+c退出red5状态监测。 如果需要将Red5服务配置成系统服务(并可以设置在开机启动或手动启动)
按i键,在insert模式下,将以下内容粘贴进去。ESC,shift+ZZ保存退出。也可直接下载以下内容的txt文档,以免因格式造成错误。 提示:直接下载的red5.txt放到/etc/init.d/中时,去掉扩展名,并且内容上需要添加几句代码 最重要的是export JAVA_HOME=JDK的具体目录 vi /etc/init.d/red5
#!/bin/bash # For RedHat and cousins: # chkconfig:
# description: Red5 flash streaming server # processname: red5 # Created By: Yulijia ()
PROG=red5 RED5_HOME=/usr/local/red5 TOSTART=$RED5_HOME/$PROG.sh TOSTOP=$RED5_HOME/red5-shutdown.sh PIDFILE=/var/run/$PROG.pid JAVA_HOME=/usr/java/jdk1.6.0_32
# Source function library . /etc/rc.d/init.d/functions
[ -r /etc/sysconfig/red5 ] && . /etc/sysconfig/red5
RETVAL=0 export JAVA_HOME=$JAVA_HOME case "$1" in
echo -n $"Starting $PROG: "
cd $RED5_HOME
$TOSTART &/dev/null 2&/dev/null &
if [ $RETVAL -eq 0 ]; then
echo $! & $PIDFILE
touch /var/lock/subsys/$PROG
[ $RETVAL -eq 0 ] && success $"$PROG startup" || failure $"$PROG startup"
echo -n $"Shutting down $PROG: "
cd $RED5_HOME
#$TOSTOP &/dev/null 2&/dev/null &
killproc -p $PIDFILE
if [ $RETVAL -eq 0 ]; then
rm -f /var/lock/subsys/$PROG
[ $RETVAL -eq 0 ] && success $"$PROG stop" || failure $"$PROG stop"
status $PROG -p $PIDFILE
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=1 esac
exit $RETVAL 注意: 需要对/etc/init.d/functions进行授权 chmod +x /etc/init.d/functions 否则killproc函数无法识别,将导致无法停止red5服务 其它的需要授权的操作 chmod +x /etc/rc.d/init.d/red5 chmod +x /usr/local/red5/red5.sh chmod +x /usr/local/red5/red5-shutdown.sh 步骤4将启动脚本添加到服务 /sbin/chkconfig --add red5 说明:添加服务 /sbin/chkconfig red5 on
说明:on表示开机自动启动 off表示开机不自动,需要手动启动 /sbin/service red5 start
说明:手动启动服务 步骤5设置CentOS防火墙
如果用setup设置防火墙,将会覆盖以下内容,需重新设置。如果只是测试,建议关闭防火墙,以免不必要的障碍 在/etc/sysconfig/iptables文件中
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT 下增加以下内容:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5080 -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 1935 -j ACCEPT 重启防火墙/sbin/service iptables restart 查看端口是否开放/sbin/iptables -L -n 测试Red5在浏览器中访问 http://127.0.0.1:5080 * 注意Red5中所有Demo需要先安装后运行,在前述页面点击Install即可安装
But if you went to port_tester.swf using demos above or your application shows connections FAILS, this is an issue of RTMPT and RTMPTS. You can see it by running 02步 /usr/local/red5/red5.sh 03步 output trancated 04步 [INFO] [main] org.red5.server.tomcat.TomcatLoader – RTMPT server bean was not found 05步 [INFO] [main] org.red5.server.tomcat.TomcatLoader – RTMPS server bean was not found 06步 output truncated 07步 If you see this you have to uncomment the RTMPT and RTMPTS TomcatLoader in/usr/local/red5/conf/red5-core.xml 08步 vi /usr/local/red5/conf/red5-core.xml 09步 Search for a lines &!– RTMPT –& &!– &bean id=”rtmpt.server” class=”org.red5.server.net.rtmpt.TomcatRTMPTLoader” init-method=”init” lazy-init=”true”& 13步 Remove the &!– from start of &bean and –& from end of 14步 Same goes for RTMPS 查找代码: &!– RTMPS –& &!–
&bean id=”rtmps.server” class=”org.red5.server.net.rtmps.TomcatRTMPSLoader” init-method=”init” lazy-init=”true”& 18步 Remove the &!– from start of &bean and –& from end of 19步
Restart the red5 services and connection fails problem will be fixed. 20步
If you any question please use comments.
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信Windows环境上配置+运行red5源码+AS3连接red5简单示例_《Java并发编程》之6:线程池的使用_关于Qt的widget的一段代码,该怎么处理__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
Windows环境上配置+运行red5源码+AS3连接red5简单示例
《Java并发编程》之6:线程池的使用
关于Qt的widget的一段代码,该怎么处理
Windows环境上配置+运行red5源码+AS3连接red5简单示例
Windows环境下配置+运行red5源码+AS3连接red5简单示例Windows环境下配置+运行red5源码+AS3连接red5简单示例
Windows环境下+配置+运行red5源码
Red5发展很快,目前最新版本为0.9.1,与以前的版本(0.8.+、0.7.+、0.6.+)差别很大,中文资料奇缺,鉴于此,我写下这篇文章,希望能帮上您的忙。
由于没有下载到0.9.1的源码,我们现在以red5 0.9.0为例介绍如何配置、编译、运行Red5源码。Red5 0.9.0与red5 0.9.1差不多,你可以用本文所介绍的方式来配置red5 0.9.1。
1.打开red5 0.9.0的下载页面:http://red5.org/wiki/0_9_0
如下图所示:
我们点击“Windows”和”Source”两个链接来下载red5的安装包和red5的源码,我们下载安装包的目的是它包括了所有red5源码所依赖的jar包,这样很方便我们的配置。
2.下载完成之后,首先安装setup-Red5-0.9.0.exe,在安装过程中,如果提示你输入ip地址,则输入0.0.0.0,这样可以允许来自任何域的访问,如果提示输入端口,则输入8000,那么我们的web服务器将会绑定8000端口。
3.打开eclipse java开发环境,如果没有,则到http://eclipse.org/downloads/
下载Eclipse
IDE for Java Developers
,将下载后的压缩包解压到本机你喜欢的地方,然后双击eclipse.exe,如果不能运行,说明你需要一个jdk,就到/javase/downloads/widget/jdk6.jsp
下载一个适合你的操作系统的jdk,安装jdk之后,eclipse就可以运行了,打开eclipse开发 环境之后,选择一个你喜欢的工作空间。
4.新建一个Java Project,如下图所示:
5.在新建工程对话框中输入Red5,点击“Finish”按钮则新建一个名为Red5的java工程,如下图所示:
6.将red5安装目录下的所有文件夹拷贝到Red5工程根目录下,操作之后的Red5工程目录结构如下:
7.将下载的red5源文件解压并将org文件夹拷贝到我们的Red5工程的src目录下,操作之后的项目结构图如下所示:
8.这时我们看到工程中有些错误,说明缺少依赖的库,此时我们把lib文件夹中的所有jar文件添加构建路径中,操作如下图 所示:
此时我们可以看到,工程中不再提示错误。
9.我们找到org.red5.server.Bootstrap类,双击Bootstrap.java文件打开此类,按F11运行此工程。当你看到如下输出信息时,说明Red5服务器启动完成。
10.打开浏览器,在地址栏中输入http://localhost:8000,回车,如果你看到如下界面,说明你的Red5已经正在良好的运行。
11.接下来我们安装一个程序来测试一下,访问http://localhost:8000,点击“Install”链接,或者直接 在访问http://localhost:8000/installer/,则进入如下界面:
12.我们选择SOSample,点击“Install”按键安装它,等待安装完成,提示如下:
13.访问http://localhost:8000/,点击“Launch a demo”链接,或者直接访问http://localhost:8000/demos/进入如下界面:
14.在Shared Ball栏目下,我们点击“View demo”进入如下界面:
我们用此地址复制,多打开几个浏览器窗口,如下图所示:
将它们一一连接到red5服务器,尝试拖动Red5的图标,我们可以看到每个客户端的red5图标都被拖动。
15.下面我们一起来制作一个as3与red5通信的例子。
回到eclipse,在webapps目录下新建一个testred5目录,并将webapps里面的SOSample目录中所有内容拷贝到testred5目录中(如果看不见SOSample目录,请刷新一下webapps目录)。
16.在testred5目录下新建一个src目录,并将此目录做为源文件目录,操作如下图所示:
17.打开项目的属性面板,操作如下图所示:
选择Java Build Path,在Java Build Path面板中选择Source选择卡,然后我们将Default output
folder指向到Red5/webapps/testred5/WEB-INF/classes
目录,你可以通过浏览来选择此目录,也可以直接在输入框中输入“Red5/webapps/testred5/WEB-INF/classes”。如下图
点击“OK”关闭此面板。
18.我们在webapps/testred5/src源文件夹下建立一个Java类叫MainApp,此时项目结构图如下所示:
19.在MainApp类中输入如下代码:
Code block
org.red5.server.adapter.ApplicationAdapter
MainApp extends
ApplicationAdapter{
"Hello world"
20.分别修改webapps/testred5/WEB-INF目录下的文件 web.xml、red5-web.xml、red5-web.properties 如下:
Code block
="ISO-8859-1"
="/xml/ns/j2ee"
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="/xml/ns/j2ee /xml/ns/j2ee/web-app_2_4.xsd"
&display-name&
testred5&/display-name&
&context-param&
&param-name&
webAppRootKey&/param-name&
&param-value&
/testred5&/param-value&
&/context-param&
&/web-app&
red5-web.xml:
Code block
&!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&
="placeholderConfig"
="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
="location"
="/WEB-INF/red5-web.properties"
="web.context"
="org.red5.server.Context"
="web.scope"
="org.red5.server.WebScope"
init-method
="register"
="red5.server"
="global.scope"
="context"
="web.context"
="handler"
="web.handler"
="contextPath"
="${webapp.contextPath}"
="virtualHosts"
="${webapp.virtualHosts}"
="web.handler"
="MainApp"
red5-web.properties:
Code block
webapp.contextPath=/testred5
webapp.virtualHosts=*, localhost, localhost:.0.1:8088
21.保存所有工程,按F11启动red5服务器。
22.打开FlashBuilder,创建一个名为Testred5client的ActionScript 项目,在生成的主文件中输入以下代码:
Code block
flash.display
flash.events
NetStatusEvent
NetConnection
Testred5client extends
NetConnection
Testred5client(
NetConnection
addEventListener
NetStatusEvent
NET_STATUS
netStatusHandler)
"rtmp://localhost/testred5"
netStatusHandler(
NetStatusEvent
"NetConnection.Connect.Success"
"getValue"
23.按F11运行此代码,如果你看到输出面板中输出了Hello world,如下图所示,则说明你成功了。
《Java并发编程》之6:线程池的使用
《Java并发编程》之六:线程池的使用
在任务与执行策略之间的隐形耦合
有些类型的任务需要明确指定执行策略,包括:
依赖性任务、使用线程封闭机制的任务、对响应时间敏感的任务、使用ThreadLocal的任务。
只有当任务都是同类型的并且相互独立时,线程池的性能才能达到最佳。
线程饥饿死锁
public class ThreadDeadlock {
ExecutorService exec = Executors.newSingleThreadExecutor();
public class LoadFileTask implements Callable&String& {
private final String fileN
public LoadFileTask(String fileName) {
this.fileName = fileN
public String call() throws Exception {
// Here's where we would actually read the file
return "";
public class RenderPageTask implements Callable&String& {
public String call() throws Exception {
Future&String& header,
header = exec.submit(new LoadFileTask("header.html"));
footer = exec.submit(new LoadFileTask("footer.html"));
String page = renderBody();
// 将发生死锁 -- task waiting for result of subtask
return header.get() + page + footer.get();
private String renderBody() {
// Here's where we would actually render the page
return "";
每当提交了一个有依赖性的Executor任务的时候,也就是说这个任务依赖其他的任务的计算结果。要清除地知道可能会出现线程饥饿死锁,因此需要在代码或配置Executor的配置文件中记录线程池的大小限制或配置限制。
8.2 设置线程池的大小
根据Runtime.getRuntime().availableProcessors()动态计算处理器的个数
对于计算密集型的任务,在拥有N(cpu)个处理器的系统上,当线程池的大小为N + 1的时候能实现最优利用率。
对于Executor,newCachedThreadPool工厂方法是一种很好的默认的选择,它能提供比固定大小的线程池更好的排队性能,一般来讲,只要任务数量不会爆炸型增长,就选择这个。
而当需要限制当前任务的数量以满足资源管理需求的时候,那么可以选择固定大小的线程池,就像在接受网络客户请求服务器应用程序中,不然不限制,很容易产生过载的问题。服务器挂点
只有当任务都独立的时候,为线程池或工作队列设置界限才是合理的,如果任务之间存在依赖性,那么有界线程池或队列可能导致线程饥饿死锁问题,此时应该使用无界线程池例如newCachedThreadPool。
当有界队列被填满后,饱和策略开始发挥作用。ThreadPoolExecutor的饱和策略可通过setRejectedExecutionHandler来修改。
JDK提供了几个饱和策略:AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy。
AbortPolicy是默认的饱和策略,该策略抛出uncheckedException
RejectedExecutionException。
DiscardPolicy抛弃策略会悄悄抛弃这个任务
DiscardOldestPolicy会抛弃下一个即将要执行的任务(因为这个任务肯定是在队列里面放最久的,排在队列最前头)。所以这个千万别跟PriorityBlockingQueue一起用。
使用Semaphore来控制任务的提交速率:
public class BoundedExecutor {
private final E
private final S
public BoundedExecutor(Executor exec, int bound) {
this.exec =
this.semaphore = new Semaphore(bound);
public void submitTask(final Runnable command)
throws InterruptedException {
semaphore.acquire();
exec.execute(new Runnable() {
public void run() {
command.run();
} finally {
semaphore.release();
} catch (RejectedExecutionException e) {
semaphore.release();
自己定制线程池创建的线程,比如为线程指定名字,设置自定义的UncaughtExceptionHandler,向Logger写日志,维护统计信息包括多少线程被创建和销毁,以及在线程被创建和终止的时候把调试信息写入日志。
public class MyAppThread extends Thread {
public static final String DEFAULT_NAME = "MyAppThread";
private static volatile boolean debugLifecycle =
private static final AtomicInteger created = new AtomicInteger();
private static final AtomicInteger alive = new AtomicInteger();
private static final Logger log = Logger.getAnonymousLogger();
public MyAppThread(Runnable r) {
this(r, DEFAULT_NAME);
public MyAppThread(Runnable runnable, String name) {
super(runnable, name + "-" + created.incrementAndGet());
setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
public void uncaughtException(Thread t,
Throwable e) {
log.log(Level.SEVERE,
"UNCAUGHT in thread " + t.getName(), e);
public void run() {
// Copy debug flag to ensure consistent value throughout.
boolean debug = debugL
if (debug) log.log(Level.FINE, "Created " + getName());
alive.incrementAndGet();
super.run();
} finally {
alive.decrementAndGet();
if (debug) log.log(Level.FINE, "Exiting " + getName());
public static int getThreadsCreated() {
return created.get();
public static int getThreadsAlive() {
return alive.get();
public static boolean getDebug() {
return debugL
public static void setDebug(boolean b) {
debugLifecycle =
public class MyThreadFactory implements ThreadFactory {
private final String poolN
public MyThreadFactory(String poolName) {
this.poolName = poolN
public Thread newThread(Runnable runnable) {
return new MyAppThread(runnable, poolName);
扩展ThreadPoolExecutor
ThreadPoolExecutor是可扩展的,它提供了几个可以在子类中改写的方法:beforeExecute,afterExecute和terminated。
beforeExecute和afterExecute是在每个执行任务的线程调用任务的run方法之前和之后会执行的
terminated方法是在整个Executor关闭的时候,也就是所有任务都完成并且所有工作者线程关闭后执行,这个方法可以用来释放Executor在其生命周期分配的各种资源,此外还可以执行发送通知,记录日志或收集finalize统计信息等。
示例:给线程池添加统计信息:
public class TimingThreadPool extends ThreadPoolExecutor {
public TimingThreadPool() {
super(1, 1, 0L, TimeUnit.SECONDS, null);
private final ThreadLocal&Long& startTime = new ThreadLocal&Long&();
private final Logger log = Logger.getLogger("TimingThreadPool");
private final AtomicLong numTasks = new AtomicLong();
private final AtomicLong totalTime = new AtomicLong();
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
log.fine(String.format("Thread %s: start %s", t, r));
startTime.set(System.nanoTime());
protected void afterExecute(Runnable r, Throwable t) {
long endTime = System.nanoTime();
long taskTime = endTime - startTime.get();
numTasks.incrementAndGet();
totalTime.addAndGet(taskTime);
log.fine(String.format("Thread %s: end %s, time=%dns",
t, r, taskTime));
} finally {
super.afterExecute(r, t);
protected void terminated() {
(String.format("Terminated: avg time=%dns",
totalTime.get() / numTasks.get()));
} finally {
super.terminated();
递归算法的并行化
当串行循环中各个迭代操作之间彼此独立,并且每个迭代操作执行的工作量比管理一个新任务带来的开销更多,那么这个串行循环就适合并行化。
public abstract class TransformingSequential {
void processSequentially(List&Element& elements) {
for (Element e : elements)
process(e);
void processInParallel(Executor exec, List&Element& elements) {
for (final Element e : elements)
exec.execute(new Runnable() {
public void run() {
process(e);
public abstract void process(Element e);
public &T& void sequentialRecursive(List&Node&T&& nodes,
Collection&T& results) {
for (Node&T& n : nodes) {
results.pute());
sequentialRecursive(n.getChildren(), results);
public &T& void parallelRecursive(final Executor exec,
List&Node&T&& nodes,
final Collection&T& results) {
for (final Node&T& n : nodes) {
exec.execute(new Runnable() {
public void run() {
results.pute());
parallelRecursive(exec, n.getChildren(), results);
public &T& Collection&T& getParallelResults(List&Node&T&& nodes)
throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
Queue&T& resultQueue = new ConcurrentLinkedQueue&T&();
parallelRecursive(exec, nodes, resultQueue);
exec.shutdown();
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
return resultQ
interface Element {
interface Node&T& {
T compute();
List&Node&T&& getChildren();
示例:谜题框架
这项技术的一种强大应用就是解决一些谜题,这些谜题都需要找出一系列的操作从初始状态转换到目标状态,例如类似于 搬箱子 、 Hi-Q 、 四色方柱Instant Insanity和其他的棋牌谜题
具体算法描述和解法,请参考我的另一篇算法文章:
利用递归算法并行化解决谜题框架
关于Qt的widget的一段代码,该怎么处理
关于Qt的widget的一段代码#include &QApplication&
#include &QWidget&
//#include &QBoxLayout&
#include &QHBoxLayout&
//#include &QVBoxLayout&
#include &QSpinBox&
#include &QSlider&
#include &QLabel&
int main(int argc, char *argv[])
QApplication a(argc, argv);
window.setWindowTitle("Enter your age");
QSpinBox *spinBox = new QSpinBox(&window);
QSlider *slider = new QSlider(Qt::Horizontal, &window);
spinBox-&setRange(0, 130);
slider-&setRange(0, 130);
QLabel * laybel = new QLabel(&window);
laybel-&setText( QString::fromLocal8Bit("中文啊啊啊啊啊啊啊啊啊啊啊") );
QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueC
QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);
spinBox-&setValue(35);
QHBoxLayout *layout = new QHBoxL
layout-&addWidget(spinBox);
layout-&addWidget(slider);
layout-&addWidget(laybel);
window.setLayout(layout);
window.show();
return a.exec();
为什么QLabel、QSlider、QHBoxLayout等都需要用new关键字,而QW这句不需要new呢?
------解决方案--------------------
Quote: 引用:
一个是指针 一个是对象
为什么不都是对象
QWidget *window = new QW
window-&setWindowTitle("Enter Your Age");
你也可以这样------解决方案--------------------
#include &QApplication&
#include &QWidget&
//#include &QBoxLayout&
#include &QHBoxLayout&
//#include &QVBoxLayout&
#include &QSpinBox&
#include &QSlider&
#include &QLabel&
int main(int argc, char *argv[])
QApplication a(argc, argv);
window.setWindowTitle("Enter your age");
QSpinBox *spinBox = new QSpinBox(&window);
QSlider *slider = new QSlider(Qt::Horizontal, &window);
spinBox-&setRange(0, 130);
slider-&setRange(0, 130);
QLabel * laybel = new QLabel(&window);
laybel-&setText( QString::fromLocal8Bit("中文啊啊啊啊啊啊啊啊啊啊啊") );
QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueC
QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);
spinBox-&setValue(35);
QHBoxLayout *layout = new QHBoxL
layout-&addWidget(spinBox);
layout-&addWidget(slider);
layout-&addWidget(laybel);
window.setLayout(layout);
window.show();
return a.exec();
为什么QLabel、QSlider、QHBoxLayout等都需要用new关键字,而QW这句不需要new呢?
在这里,你也可以不用new的。就直接 Qlabel label就好了。
用new的话,主要是怕跳出作用域被释放了。因为new的话,是在堆申请内存,系统不管回收空间,得自己搞。
像你这个环境里面,这些东西都是在main函数里面,也就是不会有被提前释放的危险。所以你这种情况下,new与不new都可以------解决方案--------------------
这种情况看个人喜好了,要是我我也用new。因为定义在别的头文件里面,一般都是用new的,具体原因楼上说明了。这样利于统一代码风格。------解决方案--------------------
你也可以这样
这样不行,你差点把我的电脑弄爆炸了。
太夸张了吧,爆炸?????????
这样怎么不行了?意思不都一样么?
我的个人理解是指针方便,而已后面的只要写指针就好,不然每次用到都要&xxxx的,麻烦。传参还是指针方便。再者就是对象,个人感觉是用在比较大的简洁方面的东西
下面的你参考一下,指针跟对象。就像楼上那位说的
用指针要释放。但是你的在父窗口里,widget释放来,那些new的也都自动释放了。#include &QApplication&
#include &QHBoxLayout&
#include &QSlider&
#include &QSpinBox&
int main(int argc, char *argv[])
QApplication app(argc, argv);
QWidget *window = new QW
window-&setWindowTitle("Enter Your Age");
QSpinBox spinB
QSlider *slider = new QSlider(Qt::Horizontal);
spinBox.setRange(0, 130);
slider-&setRange(0, 130);
QObject::connect(&spinBox, SIGNAL(valueChanged(int)),
slider, SLOT(setValue(int)));
QObject::connect(slider, SIGNAL(valueChanged(int)),
&spinBox, SLOT(setValue(int)));
spinBox.setValue(35);
QHBoxLayout *layout = new QHBoxL
layout-&addWidget(&spinBox);
layout-&addWidget(slider);
window-&setLayout(layout);
window-&show();
return app.exec();
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 ubuntu install red5 的文章

 

随机推荐